0

在 warp 中考虑以下路由规范:

let read_book_route = warp::path!("book" / Address)
        .and(warp::get())
        .and(warp::any().map(move || read_book_state.clone()))
        .and_then(handler::read_book_handler);

如果 URL 中提供了 non- Address,warp 会自动返回 HTTP 405 Method Not Allowed 状态代码:

$ curl -i http://example.com/book/not_a_valid_address
HTTP/1.1 405 Method Not Allowed
content-type: text/plain; charset=utf-8
content-length: 23
date: Thu, 25 Feb 2021 06:22:20 GMT

HTTP method not allowed

为什么是 HTTP 405?为什么不是 HTTP 400 或任何其他客户端错误?

4

2 回答 2

1

path!可以理解为一个序列path()并由param()一个end()(默认情况下)限制,并且根据文档param()

如果无法解析该值,则使用 拒绝404 Not Found

然而AFAIK 这是一个Rejection,这意味着 warp 将尝试下一个 filter or-ed 并得到它的拒绝。

由于您没有提供最小的复制示例并且也没有显示所有代码,因此我希望会有其他过滤器,而且我不太了解 warp 如何处理组合拒绝,也不知道您是否有例如一个recover可以拦截not_found将产生的中间件param(),并让另一个拒绝优先。

于 2021-02-25T08:45:17.410 回答
0

不确定 100%(缺少某些上下文),但可能与此问题有关:https ://github.com/seanmonstar/warp/issues/77 (还提出了一些可能的解决方法)

由于过滤器形成一棵树,如果一个分支因拒绝而失败,也可以尝试相邻分支。Warp 具有拒绝的优先级。并且MethodNotAllowed与 相比具有更高的优先级NotFound。因此,如果路径与一个分支不匹配NotFound,与不同的参数类型一样,warp将尝试其他路径 - 并覆盖拒绝,MethodNotAllowed因为其他分支有其他方法。

您可以使用跟踪日志级别运行服务器RUST_LOG=trace cargo run并检查过滤器匹配的执行方式。

于 2021-11-04T05:43:01.790 回答