diff --git a/content/docs/extractors.md b/content/docs/extractors.md index 0bd1301..d5ea341 100644 --- a/content/docs/extractors.md +++ b/content/docs/extractors.md @@ -9,18 +9,11 @@ weight: 170 Actix-web provides a facility for type-safe request information access called *extractors* (ie, `impl FromRequest`). By default, actix-web provides several extractor implementations. -## Extractors Within Handler Functions - -An extractor can be accessed in a few different ways. - -Option 1 - passed as a parameter to a handler function: +An extractor can be accessed as an arguments to a handler function. Actix-web supports +up to 10 extractors per handler function. Argument position does not matter. {{< include-example example="extractors" file="main.rs" section="option-one" >}} -Option 2 - accessed by calling `extract()` on the Extractor - -{{< include-example example="extractors" file="main.rs" section="option-two" >}} - # Path [*Path*][pathstruct] provides information that can be extracted from the Request's @@ -78,15 +71,6 @@ the *serde* crate. {{< include-example example="extractors" file="form.rs" section="form" >}} -# Multiple extractors - -Actix-web provides extractor implementations for tuples (up to 10 elements) whose -elements implement `FromRequest`. - -For example we can use a path extractor and a query extractor at the same time. - -{{< include-example example="extractors" file="multiple.rs" section="multi" >}} - # Other Actix-web also provides several other extractors: @@ -102,7 +86,7 @@ Actix-web also provides several other extractors: * *Payload* - You can access a request's payload. [*Example*][payloadexample] -# Async Data Access +# Application state extractor Application state is accessible from the handler with the `web::Data` extractor; however, state is accessible as a read-only reference. If you need mutable access to state, @@ -125,7 +109,7 @@ number of requests processed per thread. A proper implementation would use `Arc` > Be careful with synchronization primitives like `Mutex` or `RwLock`. The `actix-web` framework > handles requests asynchronously. By blocking thread execution, all concurrent > request handling processes would block. If you need to share or update some state -> from multiple threads, consider using the [actix][actix] actor system. +> from multiple threads, consider using the tokio synchronization primitives. [pathstruct]: https://docs.rs/actix-web/2/actix_web/dev/struct.Path.html [querystruct]: https://docs.rs/actix-web/2/actix_web/web/struct.Query.html diff --git a/content/docs/response.md b/content/docs/response.md index 921dffc..d28d5ed 100644 --- a/content/docs/response.md +++ b/content/docs/response.md @@ -66,7 +66,7 @@ negotiation. # JSON Response The `Json` type allows to respond with well-formed JSON data: simply return a value of -type Json where `T` is the type of a structure to serialize into *JSON*. +type `Json` where `T` is the type of a structure to serialize into *JSON*. The type `T` must implement the `Serialize` trait from *serde*. {{< include-example example="responses" file="json_resp.rs" section="json-resp" >}} diff --git a/examples/extractors/src/json_two.rs b/examples/extractors/src/json_two.rs index a619655..bf7b9f9 100644 --- a/examples/extractors/src/json_two.rs +++ b/examples/extractors/src/json_two.rs @@ -19,19 +19,17 @@ async fn main() -> std::io::Result<()> { HttpServer::new(|| { App::new().service( web::resource("/") - .data( - // change json extractor configuration - web::Json::::configure(|cfg| { - cfg.limit(4096).error_handler(|err, _req| { - // <- create custom error response - error::InternalError::from_response( - err, - HttpResponse::Conflict().finish(), - ) - .into() - }) - }), - ) + // change json extractor configuration + .app_data(web::Json::::configure(|cfg| { + cfg.limit(4096).error_handler(|err, _req| { + // create custom error response + error::InternalError::from_response( + err, + HttpResponse::Conflict().finish(), + ) + .into() + }) + })) .route(web::post().to(index)), ) }) diff --git a/examples/extractors/src/multiple.rs b/examples/extractors/src/multiple.rs index 2a1cc09..76cd0e7 100644 --- a/examples/extractors/src/multiple.rs +++ b/examples/extractors/src/multiple.rs @@ -7,7 +7,9 @@ struct Info { username: String, } -async fn index((path, query): (web::Path<(u32, String)>, web::Query)) -> String { +async fn index( + (path, query): (web::Path<(u32, String)>, web::Query), +) -> String { format!( "Welcome {}, friend {}, userid {}!", query.username, path.1, path.0 diff --git a/examples/extractors/src/path_three.rs b/examples/extractors/src/path_three.rs index 98484c5..656e3d5 100644 --- a/examples/extractors/src/path_three.rs +++ b/examples/extractors/src/path_three.rs @@ -2,7 +2,8 @@ use actix_web::{web, HttpRequest, Result}; // async fn index(req: HttpRequest) -> Result { - let name: String = req.match_info().get("friend").unwrap().parse().unwrap(); + let name: String = + req.match_info().get("friend").unwrap().parse().unwrap(); let userid: i32 = req.match_info().query("userid").parse().unwrap(); Ok(format!("Welcome {}, userid {}!", name, userid)) diff --git a/examples/request-handlers/src/handlers_arc.rs b/examples/request-handlers/src/handlers_arc.rs index 766dd15..f6c69a8 100644 --- a/examples/request-handlers/src/handlers_arc.rs +++ b/examples/request-handlers/src/handlers_arc.rs @@ -28,7 +28,7 @@ async fn main() -> std::io::Result<()> { HttpServer::new(move || { App::new() - .data(data.clone()) + .app_data(data.clone()) .route("/", web::to(show_count)) .route("/add", web::to(add_one)) }) diff --git a/examples/request-handlers/src/main.rs b/examples/request-handlers/src/main.rs index 2d29c5f..dfbb71e 100644 --- a/examples/request-handlers/src/main.rs +++ b/examples/request-handlers/src/main.rs @@ -29,7 +29,7 @@ async fn main() -> std::io::Result<()> { HttpServer::new(move || { App::new() - .data(data.clone()) + .app_data(data.clone()) .route("/", web::to(show_count)) .route("/add", web::to(add_one)) }) diff --git a/examples/responses/src/chunked.rs b/examples/responses/src/chunked.rs index 0c80ed4..93eda43 100644 --- a/examples/responses/src/chunked.rs +++ b/examples/responses/src/chunked.rs @@ -1,23 +1,22 @@ -// // -// use actix_web::{web, HttpRequest, HttpResponse}; -// use bytes::Bytes; -// use futures::stream::once; +// +use actix_web::{web, HttpRequest, HttpResponse}; +use bytes::Bytes; +use futures::future::ok; +use futures::stream::once; -// fn index(req: HttpRequest) -> HttpResponse { -// HttpResponse::Ok() -// .chunked() -// .body(Body::Streaming(Box::new(once(Ok(Bytes::from_static( -// b"data", -// )))))) -// } -// // +async fn index(req: HttpRequest) -> HttpResponse { + HttpResponse::Ok() + .chunked() + .streaming(once(ok::<_, Error>(Bytes::from_static(b"data")))) +} +// -// pub fn main() { -// use actix_web::{web, App, HttpServer}; +pub fn main() { + use actix_web::{web, App, HttpServer}; -// HttpServer::new(|| App::new().route("/", web::get().to(index))) -// .bind("127.0.0.1:8088") -// .unwrap() -// .run() -// .unwrap(); -// } + HttpServer::new(|| App::new().route("/", web::get().to(index))) + .bind("127.0.0.1:8088") + .unwrap() + .run() + .unwrap(); +}