首页 > 解决方案 > 为什么 warp 会为输入错误的参数返回 HTTP 405 Method Not Allowed?

问题描述

在 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 或任何其他客户端错误?

标签: resthttpcurlrustrust-warp

解决方案


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

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

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

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


推荐阅读