JSON 请求
有几种选项可以用于 JSON 请求体的反序列化。
第一种选项是使用 Json 提取器。首先,你定义一个接受 Json<T>
作为参数的处理函数,然后使用 .to()
方法注册这个处理函数。也可以通过使用 serde_json::Value
作为类型 T
来接受任意有效的 JSON 对象。
第一个 JSON 请求
的示例依赖于 serde
:
[dependencies]
serde = { version = "1.0", features = ["derive"] }
第二个 JSON 请求
的示例依赖于 serde
、serde_json
和 futures
:
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1"
futures = "0.3"
如果你想为字段添加默认值,请参考 serde
的文档。
你也可以手动将负载加载到内存中,然后进行反序列化。
在以下示例中,我们将反序列化一个 MyObj 结构体。我们需要先加载请求体,然后将 JSON 反序列化为一个对象。
两种选项的完整示例可在示例目录中找到。
内容编码
Actix Web 自动解压负载。支持以下编解码器:
- Brotli
- Gzip
- Deflate
- Zstd
如果请求头包含 Content-Encoding
头,则根据头的值解压请求负载。不支持多种编解码器,即:Content-Encoding: br, gzip
。
分块传输编码
Actix 自动解码 chunked 编码。web::Payload
提取器已经包含了解码后的字节流。如果请求负载使用支持的压缩编解码器(br、gzip、deflate)进行压缩,则字节流会被解压。
多部分体
Actix Web 提供了一个外部 crate actix-multipart
来支持多部分流。
完整示例可在示例目录中找到。
Urlencoded 请求体
Actix Web 提供了对 application/x-www-form-urlencoded 编码请求体的支持,使用 web::Form
提取器,该提取器解析为反序列化实例。实例的类型必须实现 serde 的 Deserialize
特性。
UrlEncoded future 在以下几种情况下可能会解析为错误:
- 内容类型不是
application/x-www-form-urlencoded
- 传输编码是
chunked
- 内容长度大于 256k
- 负载终止时出错
流式请求
HttpRequest 是一个 Bytes
对象的流。它可以用来读取请求体负载。
在以下示例中,我们逐块读取并打印请求负载: