1
0
mirror of https://github.com/actix/actix-website synced 2025-06-29 08:14:58 +02:00

review handlers section

This commit is contained in:
Nikolay Kim
2020-01-02 13:11:12 +06:00
parent e30c20016e
commit 4046b0b697
6 changed files with 28 additions and 104 deletions

View File

@ -6,12 +6,12 @@ weight: 160
# Request Handlers
A request handler is a function that accepts zero or more parameters that can be extracted
A request handler is an async function that accepts zero or more parameters that can be extracted
from a request (ie, [*impl FromRequest*][implfromrequest]) and returns a type that can
be converted into an HttpResponse (ie, [*impl Responder*][implresponder]).
Request handling happens in two stages. First the handler object is called, returning any
object that implements the [*Responder*][respondertrait] trait. Then, `respond_to()` is
object that implements the [*Responder*][respondertrait] trait. Then, `respond_to()` is
called on the returned object, converting itself to a `HttpResponse` or `Error`.
By default actix-web provides `Responder` implementations for some standard types,
@ -22,13 +22,13 @@ such as `&'static str`, `String`, etc.
Examples of valid handlers:
```rust
fn index(_req: HttpRequest) -> &'static str {
async fn index(_req: HttpRequest) -> &'static str {
"Hello world!"
}
```
```rust
fn index(_req: HttpRequest) -> String {
async fn index(_req: HttpRequest) -> String {
"Hello world!".to_owned()
}
```
@ -37,13 +37,13 @@ You can also change the signature to return `impl Responder` which works well if
complex types are involved.
```rust
fn index(_req: HttpRequest) -> impl Responder {
async fn index(_req: HttpRequest) -> impl Responder {
Bytes::from_static(b"Hello world!")
}
```
```rust
fn index(req: HttpRequest) -> Box<Future<Item=HttpResponse, Error=Error>> {
async fn index(req: HttpRequest) -> Box<Future<Item=HttpResponse, Error=Error>> {
...
}
```
@ -56,28 +56,13 @@ Let's create a response for a custom type that serializes to an `application/jso
{{< include-example example="responder-trait" file="main.rs" section="responder-trait" >}}
## Async handlers
## Streaming response body
There are two different types of async handlers. Response objects can be generated asynchronously
or more precisely, any type that implements the [*Responder*][respondertrait] trait.
In this case, the handler must return a `Future` object that resolves to the *Responder* type, i.e:
{{< include-example example="async-handlers" file="main.rs" section="async-responder" >}}
Or the response body can be generated asynchronously. In this case, body must implement
Response body can be generated asynchronously. In this case, body must implement
the stream trait `Stream<Item=Bytes, Error=Error>`, i.e:
{{< include-example example="async-handlers" file="stream.rs" section="stream" >}}
Both methods can be combined. (i.e Async response with streaming body)
It is possible to return a `Result` where the `Result::Item` type can be `Future`. In
this example, the `index` handler can return an error immediately or return a future
that resolves to a `HttpResponse`.
{{< include-example example="async-handlers" file="async_stream.rs" section="async-stream" >}}
## Different return types (Either)
Sometimes, you need to return different types of responses. For example, you can error