请求

内容编码

kayrx::web 自动解压/缩内容负载。支持以下编/解码器:

  • Brotli
  • Chunked
  • Compress
  • Gzip
  • Deflate
  • Identity
  • Trailers
  • EncodingExt

如果请求标头包含Content-Encoding标头,则根据标头值对请求有效负载进行解压缩。不支持多个编/解码器,即:Content-Encoding: br, gzip.

JSON请求

json正文反序列化有几种选择 :

第一种选择是使用Json提取器。首先,定义一个处理函数接受Json<T>作为参数,然后,使用该.to()方法注册该处理函数。也可以通过使用serde_json::Valuetype 作为类型T, 来接受任意有效的json对象.

use kayrx::web::{web, App, HttpServer, Result}; use serde::Deserialize; #[derive(Deserialize)] struct Info { username: String, } /// extract `Info` using serde async fn index(info: web::Json<Info>) -> Result<String> { Ok(format!("Welcome {}!", info.username)) } #[kayrx::main] async fn main() -> std::io::Result<()> { HttpServer::new(|| App::new().route("/", web::post().to(index))) .bind("127.0.0.1:8088")? .run() .await }

您也可以将有效负载(payload)手动加载到内存中,然后反序列化。

在下面的示例中,我们将反序列化MyObj结构。我们需要先加载请求主体,然后将json反序列化为一个对象。

use kayrx::web::{error, web, App, Error, HttpResponse}; use bytes::BytesMut; use futures::StreamExt; use serde::{Deserialize, Serialize}; use serde_json; #[derive(Serialize, Deserialize)] struct MyObj { name: String, number: i32, } const MAX_SIZE: usize = 262_144; // max payload size is 256k async fn index_manual(mut payload: web::Payload) -> Result<HttpResponse, Error> { // payload is a stream of Bytes objects let mut body = BytesMut::new(); while let Some(chunk) = payload.next().await { let chunk = chunk?; // limit max size of in-memory payload if (body.len() + chunk.len()) > MAX_SIZE { return Err(error::ErrorBadRequest("overflow")); } body.extend_from_slice(&chunk); } // body is loaded, now we can deserialize serde-json let obj = serde_json::from_slice::<MyObj>(&body)?; Ok(HttpResponse::Ok().json(obj)) // <- send response }

示例中提供了这两个选项的完整示例.

分块传输编码

kayrx::web自动解码分块编码。该web::Payload 提取已经包含了解码的字节流。如果使用支持的压缩编解码器(br, gzip, deflate)之一压缩请求负载,则将字节流解压缩

Multipart body

kayrx::web使用keclc_multipart提供Multipart body支持.

目录中提供了完整的示例

Urlencoded body

kayrx::webapplication / x-www-form-urlencoded编码内容提供支持, 通过web::Form提取器解析为反序列化实例. 实例的类型必须实现serdeDeserialize特征

该url编码将若干情况下可以解析成错误:

  • 内容类型不是 application/x-www-form-urlencoded
  • 传输编码为chunked
  • 内容长度大于256k
  • 负载(payload)因错误而终止。
use kayrx::web::{web, HttpResponse}; use serde::Deserialize; #[derive(Deserialize)] struct FormData { username: String, } async fn index(form: web::Form<FormData>) -> HttpResponse { HttpResponse::Ok().body(format!("username: {}", form.username)) }

流请求

HttpRequest是Bytes对象流。它可用于读取请求主体负载.

在以下示例中,我们逐块读取并打印请求负载:

use kayrx::web::{web, Error, HttpResponse}; use futures::StreamExt; async fn index(mut body: web::Payload) -> Result<HttpResponse, Error> { let mut bytes = web::BytesMut::new(); while let Some(item) = body.next().await { bytes.extend_from_slice(&item?); } println!("Chunk: {:?}", bytes); Ok(HttpResponse::Ok().finish()) }