当捕获类型化标头的处理程序缺少标头时,axum 中会发生什么?

问题描述 投票:0回答:1

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 标头作为示例,但我对一般答案感兴趣。

rust hyper rust-axum
1个回答
0
投票

如果

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
,否则为错误值。
此技术适用于任何提取器。

© www.soinside.com 2019 - 2024. All rights reserved.