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