响应

类似构建器的模式用于构造实例HttpResponseHttpResponse提供了几个返回HttpResponseBuilder实例的方法,它实现了构建响应的各种便捷方法。

检查文档中的类型说明。

方法.body.finish.json最终确定响应创建并返回构造的HttpResponse实例。如果多次在同一构建器实例上调用此方法,则构建器将发生混乱。

  1. use actix_web::{HttpRequest, HttpResponse, http::ContentEncoding};
  2. fn index(req: &HttpRequest) -> HttpResponse {
  3. HttpResponse::Ok()
  4. .content_encoding(ContentEncoding::Br)
  5. .content_type("plain/text")
  6. .header("X-Hdr", "sample")
  7. .body("data")
  8. }

内容编码

Actix自动压缩有效负载。支持以下编解码器:

  • Brotli
  • Gzip
  • Deflate
  • Identity

响应有效负载基于content_encoding参数进行压缩。默认情况下,ContentEncoding::Auto使用。如果ContentEncoding::Auto选择,则压缩取决于请求的Accept-Encoding标头。

ContentEncoding::Identity可用于禁用压缩。如果选择了其他内容编码,则对该编解码器强制执行压缩。

例如,要启用 brotli使用 ContentEncoding::Br:

  1. use actix_web::{HttpRequest, HttpResponse, http::ContentEncoding};
  2. fn index(req: HttpRequest) -> HttpResponse {
  3. HttpResponse::Ok()
  4. .content_encoding(ContentEncoding::Br)
  5. .body("data")
  6. }

在这种情况下,我们通过将内容编码设置为一个Identity值来显式禁用内容压缩:

  1. use actix_web::{HttpRequest, HttpResponse, http::ContentEncoding};
  2. fn index(req: HttpRequest) -> HttpResponse {
  3. HttpResponse::Ok()
  4. // v- disable compression
  5. .content_encoding(ContentEncoding::Identity)
  6. .body("data")
  7. }

此外,可以在应用程序级别设置默认内容编码,默认情况下ContentEncoding::Auto使用,这意味着自动内容压缩协商。

  1. use actix_web::{App, HttpRequest, HttpResponse, http::ContentEncoding};
  2. fn index(req: HttpRequest) -> HttpResponse {
  3. HttpResponse::Ok()
  4. .body("data")
  5. }
  6. fn main() {
  7. let app = App::new()
  8. // v- disable compression for all routes
  9. .default_encoding(ContentEncoding::Identity)
  10. .resource("/index.html", |r| r.with(index));
  11. }

JSON响应

该Json类型允许使用格式良好的JSON数据进行响应:只返回Json类型的值哪个T是要序列化为JSON的结构的类型。该类型T必须实现serde的Serialize特征。

  1. # extern crate actix_web;
  2. #[macro_use] extern crate serde_derive;
  3. use actix_web::{App, HttpRequest, Json, Result, http::Method};
  4. #[derive(Serialize)]
  5. struct MyObj {
  6. name: String,
  7. }
  8. fn index(req: &HttpRequest) -> Result<Json<MyObj>> {
  9. Ok(Json(MyObj{name: req.match_info().query("name")?}))
  10. }
  11. fn main() {
  12. App::new()
  13. .resource(r"/a/{name}", |r| r.method(Method::GET).f(index))
  14. .finish();
  15. }

分块传输编码

可以启用响应的分块编码HttpResponseBuilder::chunked()。这生效仅供Body::Streaming(BodyStream)Body::StreamingContext机构。如果启用了响应有效负载压缩并使用了流体,则会自动启用分块编码。

禁止为HTTP / 2.0响应启用分块编码。

  1. use actix_web::*;
  2. use bytes::Bytes;
  3. use futures::stream::once;
  4. fn index(req: HttpRequest) -> HttpResponse {
  5. HttpResponse::Ok()
  6. .chunked()
  7. .body(Body::Streaming(Box::new(once(Ok(Bytes::from_static(b"data"))))))
  8. }