2018-05-22 23:15:08 +02:00
|
|
|
---
|
|
|
|
title: Requests
|
|
|
|
menu: docs_advanced
|
|
|
|
weight: 200
|
|
|
|
---
|
|
|
|
|
|
|
|
# JSON Request
|
|
|
|
|
|
|
|
There are several options for json body deserialization.
|
|
|
|
|
|
|
|
The first option is to use *Json* extractor. First, you define a handler function
|
2019-06-17 20:34:23 +02:00
|
|
|
that accepts `Json<T>` as a parameter, then, you use the `.to()` method for registering
|
2018-05-22 23:15:08 +02:00
|
|
|
this handler. It is also possible to accept arbitrary valid json object by
|
|
|
|
using `serde_json::Value` as a type `T`.
|
|
|
|
|
2021-02-28 02:42:22 +01:00
|
|
|
First example of json of `JSON Request` depends on `serde`:
|
|
|
|
```toml
|
|
|
|
[dependencies]
|
|
|
|
serde = "1"
|
|
|
|
````
|
|
|
|
Second example of `JSON Request` depends on `serde` and `serde_json`:
|
|
|
|
```toml
|
|
|
|
[dependencies]
|
|
|
|
serde = "1"
|
|
|
|
serde_json = "1"
|
|
|
|
```
|
|
|
|
If you want to add default value for a field, refer to `serde`'s [documentation](https://serde.rs/attr-default.html).
|
|
|
|
|
2019-06-17 20:34:23 +02:00
|
|
|
{{< include-example example="requests" file="main.rs" section="json-request" >}}
|
2018-05-22 23:15:08 +02:00
|
|
|
|
|
|
|
You may also manually load the payload into memory and then deserialize it.
|
|
|
|
|
|
|
|
In the following example, we will deserialize a *MyObj* struct. We need to load the request
|
|
|
|
body first and then deserialize the json into an object.
|
|
|
|
|
2019-06-17 20:34:23 +02:00
|
|
|
{{< include-example example="requests" file="manual.rs" section="json-manual" >}}
|
2018-05-22 23:15:08 +02:00
|
|
|
|
2019-06-25 05:36:32 +02:00
|
|
|
> A complete example for both options is available in [examples directory][examples].
|
2018-05-22 23:15:08 +02:00
|
|
|
|
2021-12-05 15:41:37 +01:00
|
|
|
# Content Encoding
|
|
|
|
|
|
|
|
Actix-web automatically *decompresses* payloads. The following codecs are supported:
|
|
|
|
|
|
|
|
* Brotli
|
|
|
|
* Gzip
|
|
|
|
* Deflate
|
|
|
|
* Zstd
|
|
|
|
|
|
|
|
If request headers contain a `Content-Encoding` header, the request payload is decompressed
|
|
|
|
according to the header value. Multiple codecs are not supported, i.e: `Content-Encoding: br, gzip`.
|
|
|
|
|
2018-05-22 23:15:08 +02:00
|
|
|
# Chunked transfer encoding
|
|
|
|
|
2019-06-26 07:27:17 +02:00
|
|
|
Actix automatically decodes *chunked* encoding. The [`web::Payload`][payloadextractor]
|
|
|
|
extractor already contains the decoded byte stream. If the request payload is compressed
|
|
|
|
with one of the supported compression codecs (br, gzip, deflate), then the byte stream
|
|
|
|
is decompressed.
|
2018-05-22 23:15:08 +02:00
|
|
|
|
|
|
|
# Multipart body
|
|
|
|
|
2019-06-28 19:31:30 +02:00
|
|
|
Actix-web provides multipart stream support with an external crate, [`actix-multipart`][multipartcrate].
|
2018-05-22 23:15:08 +02:00
|
|
|
|
2019-06-25 05:36:32 +02:00
|
|
|
> A full example is available in the [examples directory][multipartexample].
|
2018-05-22 23:15:08 +02:00
|
|
|
|
|
|
|
# Urlencoded body
|
|
|
|
|
2019-06-26 07:27:17 +02:00
|
|
|
Actix-web provides support for *application/x-www-form-urlencoded* encoded bodies with
|
2019-06-26 09:11:05 +02:00
|
|
|
the [`web::Form`][formencoded] extractor which resolves to the deserialized instance. The
|
2019-06-26 07:27:17 +02:00
|
|
|
type of the instance must implement the `Deserialize` trait from *serde*.
|
2018-05-22 23:15:08 +02:00
|
|
|
|
|
|
|
The *UrlEncoded* future can resolve into an error in several cases:
|
|
|
|
|
|
|
|
* content type is not `application/x-www-form-urlencoded`
|
|
|
|
* transfer encoding is `chunked`.
|
|
|
|
* content-length is greater than 256k
|
|
|
|
* payload terminates with error.
|
|
|
|
|
2019-06-17 20:34:23 +02:00
|
|
|
{{< include-example example="requests" file="urlencoded.rs" section="urlencoded" >}}
|
2018-05-22 23:15:08 +02:00
|
|
|
|
|
|
|
# Streaming request
|
|
|
|
|
|
|
|
*HttpRequest* is a stream of `Bytes` objects. It can be used to read the request
|
|
|
|
body payload.
|
|
|
|
|
|
|
|
In the following example, we read and print the request payload chunk by chunk:
|
|
|
|
|
2019-06-17 20:34:23 +02:00
|
|
|
{{< include-example example="requests" file="streaming.rs" section="streaming" >}}
|
2019-06-25 05:36:32 +02:00
|
|
|
|
2021-02-26 19:48:27 +01:00
|
|
|
[examples]: https://github.com/actix/examples/tree/master/json/json
|
2019-12-28 18:32:47 +01:00
|
|
|
[multipartstruct]: https://docs.rs/actix-multipart/0.2/actix_multipart/struct.Multipart.html
|
|
|
|
[fieldstruct]: https://docs.rs/actix-multipart/0.2/actix_multipart/struct.Field.html
|
2021-02-26 19:48:27 +01:00
|
|
|
[multipartexample]: https://github.com/actix/examples/tree/master/forms/multipart
|
2020-09-12 17:21:54 +02:00
|
|
|
[urlencoded]: https://docs.rs/actix-web/3/actix_web/dev/struct.UrlEncoded.html
|
|
|
|
[payloadextractor]: https://docs.rs/actix-web/3/actix_web/web/struct.Payload.html
|
2019-06-26 07:27:17 +02:00
|
|
|
[multipartcrate]: https://crates.io/crates/actix-multipart
|
2021-07-12 13:47:19 +02:00
|
|
|
[formencoded]: https://docs.rs/actix-web/3/actix_web/web/struct.Form.html
|