pub struct App<T> { /* private fields */ }
Expand description

The top-level builder for an Actix Web application.

Implementations

Create application builder. Application can be configured with a builder-like pattern.

Set application (root level) data.

Application data stored with App::app_data() method is available through the HttpRequest::app_data method at runtime.

Data<T>

Any Data<T> type added here can utilize it’s extractor implementation in handlers. Types not wrapped in Data<T> cannot use this extractor. See its docs for more about its usage and patterns.

use std::cell::Cell;
use actix_web::{web, App, HttpRequest, HttpResponse, Responder};

struct MyData {
    count: std::cell::Cell<usize>,
}

async fn handler(req: HttpRequest, counter: web::Data<MyData>) -> impl Responder {
    // note this cannot use the Data<T> extractor because it was not added with it
    let incr = *req.app_data::<usize>().unwrap();
    assert_eq!(incr, 3);

    // update counter using other value from app data
    counter.count.set(counter.count.get() + incr);

    HttpResponse::Ok().body(counter.count.get().to_string())
}

let app = App::new().service(
    web::resource("/")
        .app_data(3usize)
        .app_data(web::Data::new(MyData { count: Default::default() }))
        .route(web::get().to(handler))
);
Shared Mutable State

HttpServer::new accepts an application factory rather than an application instance; the factory closure is called on each worker thread independently. Therefore, if you want to share a data object between different workers, a shareable object needs to be created first, outside the HttpServer::new closure and cloned into it. Data<T> is an example of such a sharable object.

let counter = web::Data::new(AppStateWithCounter {
    counter: Mutex::new(0),
});

HttpServer::new(move || {
    // move counter object into the closure and clone for each worker

    App::new()
        .app_data(counter.clone())
        .route("/", web::get().to(handler))
})
👎 Deprecated since 4.0.0:

Use .app_data(Data::new(val)) instead.

Add application (root) data after wrapping in Data<T>.

Deprecated in favor of app_data.

Add application data factory that resolves asynchronously.

Data items are constructed during application initialization, before the server starts accepting requests.

Run external configuration as part of the application building process

This function is useful for moving parts of configuration to a different module or even library. For example, some of the resource’s configuration could be moved to different module.

use actix_web::{web, App, HttpResponse};

// this function could be located in different module
fn config(cfg: &mut web::ServiceConfig) {
    cfg.service(web::resource("/test")
        .route(web::get().to(|| HttpResponse::Ok()))
        .route(web::head().to(|| HttpResponse::MethodNotAllowed()))
    );
}

App::new()
    .configure(config)  // <- register resources
    .route("/index.html", web::get().to(|| HttpResponse::Ok()));

Configure route for a specific path.

This is a simplified version of the App::service() method. This method can be used multiple times with same path, in that case multiple resources with one route would be registered for same resource path.

use actix_web::{web, App, HttpResponse};

async fn index(data: web::Path<(String, String)>) -> &'static str {
    "Welcome!"
}

let app = App::new()
    .route("/test1", web::get().to(index))
    .route("/test2", web::post().to(|| HttpResponse::MethodNotAllowed()));

Register HTTP service.

Http service is any type that implements HttpServiceFactory trait.

Actix Web provides several services implementations:

  • Resource is an entry in resource table which corresponds to requested URL.
  • Scope is a set of resources with common root path.
  • “StaticFiles” is a service for static files support

Default service that is invoked when no matching resource could be found.

You can use a Route as default service.

If a default service is not registered, an empty 404 Not Found response will be sent to the client instead.

Examples
use actix_web::{web, App, HttpResponse};

async fn index() -> &'static str {
    "Welcome!"
}

let app = App::new()
    .service(web::resource("/index.html").route(web::get().to(index)))
    .default_service(web::to(|| HttpResponse::NotFound()));

Register an external resource.

External resources are useful for URL generation purposes only and are never considered for matching at request time. Calls to HttpRequest::url_for() will work as expected.

use actix_web::{web, App, HttpRequest, HttpResponse, Result};

async fn index(req: HttpRequest) -> Result<HttpResponse> {
    let url = req.url_for("youtube", &["asdlkjqme"])?;
    assert_eq!(url.as_str(), "https://youtube.com/watch/asdlkjqme");
    Ok(HttpResponse::Ok().into())
}

let app = App::new()
    .service(web::resource("/index.html").route(
        web::get().to(index)))
    .external_resource("youtube", "https://youtube.com/watch/{video_id}");

Registers an app-wide middleware.

Registers middleware, in the form of a middleware component (type), that runs during inbound and/or outbound processing in the request life-cycle (request -> response), modifying request/response as necessary, across all requests managed by the App.

Use middleware when you need to read or modify every request or response in some way.

Middleware can be applied similarly to individual Scopes and Resources. See Scope::wrap and Resource::wrap.

Middleware Order

Notice that the keyword for registering middleware is wrap. As you register middleware using wrap in the App builder, imagine wrapping layers around an inner App. The first middleware layer exposed to a Request is the outermost layer (i.e., the last registered in the builder chain). Consequently, the first middleware registered in the builder chain is the last to start executing during request processing.

Ordering is less obvious when wrapped services also have middleware applied. In this case, middlewares are run in reverse order for App and then in reverse order for the wrapped service.

Examples
use actix_web::{middleware, web, App};

async fn index() -> &'static str {
    "Welcome!"
}

let app = App::new()
    .wrap(middleware::Logger::default())
    .route("/index.html", web::get().to(index));

Registers an app-wide function middleware.

mw is a closure that runs during inbound and/or outbound processing in the request life-cycle (request -> response), modifying request/response as necessary, across all requests handled by the App.

Use middleware when you need to read or modify every request or response in some way.

Middleware can also be applied to individual Scopes and Resources.

See App::wrap for details on how middlewares compose with each other.

Examples
use actix_web::{dev::Service as _, middleware, web, App};
use actix_web::http::header::{CONTENT_TYPE, HeaderValue};

async fn index() -> &'static str {
    "Welcome!"
}

let app = App::new()
    .wrap_fn(|req, srv| {
        let fut = srv.call(req);
        async {
            let mut res = fut.await?;
            res.headers_mut()
                .insert(CONTENT_TYPE, HeaderValue::from_static("text/plain"));
            Ok(res)
        }
    })
    .route("/index.html", web::get().to(index));

Trait Implementations

Convert Self to a ServiceFactory

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Converts self into T using Into<T>. Read more

Extract a subset of the possible types in a coproduct (or get the remaining possibilities) Read more

Causes self to use its Binary implementation when Debug-formatted.

Causes self to use its Display implementation when Debug-formatted. Read more

Causes self to use its LowerExp implementation when Debug-formatted. Read more

Causes self to use its LowerHex implementation when Debug-formatted. Read more

Causes self to use its Octal implementation when Debug-formatted.

Causes self to use its Pointer implementation when Debug-formatted. Read more

Causes self to use its UpperExp implementation when Debug-formatted. Read more

Causes self to use its UpperHex implementation when Debug-formatted. Read more

Returns the argument unchanged.

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Performs the indexed conversion.

Pipes by value. This is generally the method you want to use. Read more

Borrows self and passes that borrow into the pipe function. Read more

Mutably borrows self and passes that borrow into the pipe function. Read more

Borrows self, then passes self.borrow() into the pipe function. Read more

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more

Borrows self, then passes self.as_ref() into the pipe function.

Mutably borrows self, then passes self.as_mut() into the pipe function. Read more

Borrows self, then passes self.deref() into the pipe function.

Mutably borrows self, then passes self.deref_mut() into the pipe function. Read more

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

Should always be Self

Consumes the current HList and returns an HList with the requested shape. Read more

Immutable access to a value. Read more

Mutable access to a value. Read more

Immutable access to the Borrow<B> of a value. Read more

Mutable access to the BorrowMut<B> of a value. Read more

Immutable access to the AsRef<R> view of a value. Read more

Mutable access to the AsMut<R> view of a value. Read more

Immutable access to the Deref::Target of a value. Read more

Mutable access to the Deref::Target of a value. Read more

Calls .tap() only in debug builds, and is erased in release builds.

Calls .tap_mut() only in debug builds, and is erased in release builds. Read more

Calls .tap_borrow() only in debug builds, and is erased in release builds. Read more

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds. Read more

Calls .tap_ref() only in debug builds, and is erased in release builds. Read more

Calls .tap_ref_mut() only in debug builds, and is erased in release builds. Read more

Calls .tap_deref() only in debug builds, and is erased in release builds. Read more

Calls .tap_deref_mut() only in debug builds, and is erased in release builds. Read more

Attempts to convert self into T using TryInto<T>. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more