Struct uiuifree_actix_web_util::App
source · [−]pub struct App<T> { /* private fields */ }Expand description
The top-level builder for an Actix Web application.
Implementations
sourceimpl<T> App<T> where
T: ServiceFactory<ServiceRequest, Config = (), Error = Error, InitError = ()>,
impl<T> App<T> where
T: ServiceFactory<ServiceRequest, Config = (), Error = Error, InitError = ()>,
sourcepub fn app_data<U>(self, ext: U) -> App<T> where
U: 'static,
pub fn app_data<U>(self, ext: U) -> App<T> where
U: 'static,
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))
})sourcepub fn data<U>(self, data: U) -> App<T> where
U: 'static,
👎 Deprecated since 4.0.0: Use .app_data(Data::new(val)) instead.
pub fn data<U>(self, data: U) -> App<T> where
U: 'static,
Use .app_data(Data::new(val)) instead.
Add application (root) data after wrapping in Data<T>.
Deprecated in favor of app_data.
sourcepub fn data_factory<F, Out, D, E>(self, data: F) -> App<T> where
F: 'static + Fn() -> Out,
Out: 'static + Future<Output = Result<D, E>>,
D: 'static,
E: Debug,
pub fn data_factory<F, Out, D, E>(self, data: F) -> App<T> where
F: 'static + Fn() -> Out,
Out: 'static + Future<Output = Result<D, E>>,
D: 'static,
E: Debug,
Add application data factory that resolves asynchronously.
Data items are constructed during application initialization, before the server starts accepting requests.
sourcepub fn configure<F>(self, f: F) -> App<T> where
F: FnOnce(&mut ServiceConfig),
pub fn configure<F>(self, f: F) -> App<T> where
F: FnOnce(&mut ServiceConfig),
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()));sourcepub fn route(self, path: &str, route: Route) -> App<T>
pub fn route(self, path: &str, route: Route) -> App<T>
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()));sourcepub fn service<F>(self, factory: F) -> App<T> where
F: 'static + HttpServiceFactory,
pub fn service<F>(self, factory: F) -> App<T> where
F: 'static + HttpServiceFactory,
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
sourcepub fn default_service<F, U>(self, svc: F) -> App<T> where
F: IntoServiceFactory<U, ServiceRequest>,
U: 'static + ServiceFactory<ServiceRequest, Config = (), Response = ServiceResponse<BoxBody>, Error = Error>,
<U as ServiceFactory<ServiceRequest>>::InitError: Debug,
pub fn default_service<F, U>(self, svc: F) -> App<T> where
F: IntoServiceFactory<U, ServiceRequest>,
U: 'static + ServiceFactory<ServiceRequest, Config = (), Response = ServiceResponse<BoxBody>, Error = Error>,
<U as ServiceFactory<ServiceRequest>>::InitError: Debug,
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()));sourcepub fn external_resource<N, U>(self, name: N, url: U) -> App<T> where
N: AsRef<str>,
U: AsRef<str>,
pub fn external_resource<N, U>(self, name: N, url: U) -> App<T> where
N: AsRef<str>,
U: AsRef<str>,
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}");sourcepub fn wrap<M, B>(
self,
mw: M
) -> App<impl ServiceFactory<ServiceRequest, Config = (), Response = ServiceResponse<B>, Error = Error, InitError = ()>> where
M: 'static + Transform<<T as ServiceFactory<ServiceRequest>>::Service, ServiceRequest, Response = ServiceResponse<B>, Error = Error, InitError = ()>,
B: MessageBody,
pub fn wrap<M, B>(
self,
mw: M
) -> App<impl ServiceFactory<ServiceRequest, Config = (), Response = ServiceResponse<B>, Error = Error, InitError = ()>> where
M: 'static + Transform<<T as ServiceFactory<ServiceRequest>>::Service, ServiceRequest, Response = ServiceResponse<B>, Error = Error, InitError = ()>,
B: MessageBody,
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));sourcepub fn wrap_fn<F, R, B>(
self,
mw: F
) -> App<impl ServiceFactory<ServiceRequest, Config = (), Response = ServiceResponse<B>, Error = Error, InitError = ()>> where
F: 'static + Fn(ServiceRequest, &<T as ServiceFactory<ServiceRequest>>::Service) -> R + Clone,
R: Future<Output = Result<ServiceResponse<B>, Error>>,
B: MessageBody,
pub fn wrap_fn<F, R, B>(
self,
mw: F
) -> App<impl ServiceFactory<ServiceRequest, Config = (), Response = ServiceResponse<B>, Error = Error, InitError = ()>> where
F: 'static + Fn(ServiceRequest, &<T as ServiceFactory<ServiceRequest>>::Service) -> R + Clone,
R: Future<Output = Result<ServiceResponse<B>, Error>>,
B: MessageBody,
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
sourceimpl<T, B> IntoServiceFactory<AppInit<T, B>, Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>> for App<T> where
T: 'static + ServiceFactory<ServiceRequest, Config = (), Response = ServiceResponse<B>, Error = Error, InitError = ()>,
B: MessageBody,
impl<T, B> IntoServiceFactory<AppInit<T, B>, Request<Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>> + 'static, Global>>>> for App<T> where
T: 'static + ServiceFactory<ServiceRequest, Config = (), Response = ServiceResponse<B>, Error = Error, InitError = ()>,
B: MessageBody,
sourcefn into_factory(self) -> AppInit<T, B>
fn into_factory(self) -> AppInit<T, B>
Convert Self to a ServiceFactory
Auto Trait Implementations
impl<T> !RefUnwindSafe for App<T>
impl<T> !Send for App<T>
impl<T> !Sync for App<T>
impl<T> Unpin for App<T> where
T: Unpin,
impl<T> !UnwindSafe for App<T>
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<T> FmtForward for T
impl<T> FmtForward for T
fn fmt_binary(self) -> FmtBinary<Self> where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self> where
Self: Binary,
Causes self to use its Binary implementation when Debug-formatted.
fn fmt_display(self) -> FmtDisplay<Self> where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self> where
Self: Display,
Causes self to use its Display implementation when
Debug-formatted. Read more
fn fmt_lower_exp(self) -> FmtLowerExp<Self> where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self> where
Self: LowerExp,
Causes self to use its LowerExp implementation when
Debug-formatted. Read more
fn fmt_lower_hex(self) -> FmtLowerHex<Self> where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self> where
Self: LowerHex,
Causes self to use its LowerHex implementation when
Debug-formatted. Read more
fn fmt_octal(self) -> FmtOctal<Self> where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self> where
Self: Octal,
Causes self to use its Octal implementation when Debug-formatted.
fn fmt_pointer(self) -> FmtPointer<Self> where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self> where
Self: Pointer,
Causes self to use its Pointer implementation when
Debug-formatted. Read more
fn fmt_upper_exp(self) -> FmtUpperExp<Self> where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self> where
Self: UpperExp,
Causes self to use its UpperExp implementation when
Debug-formatted. Read more
fn fmt_upper_hex(self) -> FmtUpperHex<Self> where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self> where
Self: UpperHex,
Causes self to use its UpperHex implementation when
Debug-formatted. Read more
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
impl<T, U, I> LiftInto<U, I> for T where
U: LiftFrom<T, I>,
impl<T, U, I> LiftInto<U, I> for T where
U: LiftFrom<T, I>,
fn lift_into(self) -> U
fn lift_into(self) -> U
Performs the indexed conversion.
impl<T> Pipe for T where
T: ?Sized,
impl<T> Pipe for T where
T: ?Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
Pipes by value. This is generally the method you want to use. Read more
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R where
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R where
R: 'a,
Borrows self and passes that borrow into the pipe function. Read more
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R where
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R where
R: 'a,
Mutably borrows self and passes that borrow into the pipe function. Read more
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R where
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R where
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
Borrows self, then passes self.borrow() into the pipe function. Read more
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R where
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R where
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
Mutably borrows self, then passes self.borrow_mut() into the pipe
function. Read more
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R where
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R where
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
Borrows self, then passes self.as_ref() into the pipe function.
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R where
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R where
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
Mutably borrows self, then passes self.as_mut() into the pipe
function. Read more
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: Deref<Target = T>,
T: 'a + ?Sized,
R: 'a,
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: Deref<Target = T>,
T: 'a + ?Sized,
R: 'a,
Borrows self, then passes self.deref() into the pipe function.
impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Tap for T
impl<T> Tap for T
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self where
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self where
Self: Borrow<B>,
B: ?Sized,
Immutable access to the Borrow<B> of a value. Read more
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self where
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self where
Self: BorrowMut<B>,
B: ?Sized,
Mutable access to the BorrowMut<B> of a value. Read more
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self where
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self where
Self: AsRef<R>,
R: ?Sized,
Immutable access to the AsRef<R> view of a value. Read more
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self where
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self where
Self: AsMut<R>,
R: ?Sized,
Mutable access to the AsMut<R> view of a value. Read more
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self where
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self where
Self: Deref<Target = T>,
T: ?Sized,
Immutable access to the Deref::Target of a value. Read more
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self where
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self where
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
Mutable access to the Deref::Target of a value. Read more
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
Calls .tap() only in debug builds, and is erased in release builds.
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
Calls .tap_mut() only in debug builds, and is erased in release
builds. Read more
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self where
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self where
Self: Borrow<B>,
B: ?Sized,
Calls .tap_borrow() only in debug builds, and is erased in release
builds. Read more
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self where
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self where
Self: BorrowMut<B>,
B: ?Sized,
Calls .tap_borrow_mut() only in debug builds, and is erased in release
builds. Read more
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self where
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self where
Self: AsRef<R>,
R: ?Sized,
Calls .tap_ref() only in debug builds, and is erased in release
builds. Read more
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self where
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self where
Self: AsMut<R>,
R: ?Sized,
Calls .tap_ref_mut() only in debug builds, and is erased in release
builds. Read more
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
fn vzip(self) -> V
sourceimpl<T> WithSubscriber for T
impl<T> WithSubscriber for T
sourcefn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
Attaches the provided Subscriber to this type, returning a
WithDispatch wrapper. Read more
sourcefn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Attaches the current default Subscriber to this type, returning a
WithDispatch wrapper. Read more