类型安全的信息提取
Actix Web 提供了一种称为 提取器(即 impl FromRequest
)的类型安全请求信息访问工具。有许多内置的提取器实现(参见 实现者)。
提取器可以作为处理函数的参数进行访问。Actix Web 支持每个处理函数最多 12 个提取器。参数位置无关紧要。
路径
Path 提供从请求路径中提取的信息。路径中可提取的部分称为“动态段”,并用花括号标记。你可以从路径中反序列化任何变量段。
例如,对于注册了 /users/{user_id}/{friend}
路径的资源,可以反序列化两个段,user_id
和 friend
。这些段可以按声明的顺序作为元组提取(例如,Path<(u32, String)>
)。
还可以通过将动态段名称与字段名称匹配,将路径信息提取到实现了 serde
的 Deserialize
特性的类型中。以下是使用 serde
的反序列化结构(确保启用了其 derive
特性)而不是元组类型的等效示例。
作为一种非类型安全的替代方法,还可以在处理函数中按名称查询请求的路径参数(参见 match_info
文档):
查询
Query<T>
类型提供了请求查询参数的提取功能。其底层使用 serde_urlencoded
crate。
JSON
Json<T>
允许将请求体反序列化为结构体。要从请求体中提取类型化信息,类型 T
必须实现 serde::Deserialize
。
一些提取器提供了配置提取过程的方法。要配置提取器,将其配置对象传递给资源的 .app_data()
方法。在 Json 提取器的情况下,它返回一个 JsonConfig。你可以配置 JSON 负载的最大大小以及自定义错误处理函数。
以下示例将负载大小限制为 4kb 并使用自定义错误处理程序。
URL 编码表单
URL 编码的表单体可以像 Json<T>
一样提取到结构体中。此类型必须实现 serde::Deserialize
。
FormConfig 允许配置提取过程。
其他
Actix Web 还提供了许多其他提取器,以下是一些重要的:
Data
- 用于访问应用程序状态的部分。HttpRequest
-HttpRequest
本身就是一个提取器,以防你需要访问请求的其他部分。String
- 你可以将请求的负载转换为String
。一个示例 在 rustdoc 中可用。Bytes
- 你可以将请求的负载转换为 Bytes。一个示例 在 rustdoc 中可用。Payload
- 主要用于构建其他提取器的低级负载提取器。一个示例 在 rustdoc 中可用。
应用程序状态提取器
应用程序状态可以通过 web::Data
提取器从处理函数中访问;然而,状态只能作为只读引用访问。如果你需要对状态进行可变访问,则必须实现它。
以下是一个存储处理请求数量的处理函数示例:
尽管此处理函数可以工作,但 data.count
只会计算 每个工作线程 处理的请求数量。要计算所有线程处理的总请求数,应使用共享的 Arc
和 原子操作。
注意:如果你希望 整个 状态在所有线程之间共享,请使用 web::Data
和 app_data
,如 共享可变状态 中所述。
在应用程序状态中使用阻塞同步原语(如 Mutex
或 RwLock
)时要小心。Actix Web 异步处理请求。如果处理函数中的 临界区 太大或包含 .await
点,这将是一个问题。如果这是一个问题,我们建议你也阅读 Tokio 关于在异步代码中使用阻塞 Mutex
的建议。