axum 允许我使用
TypedHeader
结构在处理程序中捕获 http 标头。例如:
async fn handler(TypedHeader(if_none_match): TypedHeader<IfNoneMatch>) -> String {
let etag = "foo".parse::<ETag>().unwrap();
if if_none_match.precondition_passes(&etag) {
String::from("success")
} else {
String::from("failure")
}
}
现在我想知道如果我收到缺少
If-None-Match
标头的请求会发生什么。通过一些调试,我发现处理程序仍然会被调用并且前提条件将通过。但是,我想知道我现在收到的 IfNoneMatch
实例是什么? axum 如何设置此实例以及如何确定标头最初是否丢失?我在这里使用 If-None-Match
http 标头作为示例,但我对一般答案感兴趣。
TypedHeader
从请求中提取失败,它将拒绝该请求,并默认在正文中返回400状态代码和错误消息。
如果要处理无法提取
TypedHeader
的情况,可以将其包装在Option
中:
async fn handler(maybe_if_none_match: Option<TypedHeader<IfNoneMatch>>) -> String {
}
如果提取成功,该值将为
Some
,否则为 None
。
但是,由于编码值不正确,
TypedHeader
可能无法提取。您可能仍然希望区分这种情况,如果是这样,您可以将其包装在 Result
:
async fn handler(maybe_if_none_match: Result<TypedHeader<IfNoneMatch>, TypedHeaderRejection>) -> String {
}
错误类型需要与
FromRequestParts
实现的拒绝类型相匹配。显然,如果提取成功,该值将为 Ok
,否则为错误值。此技术适用于任何提取器。