如果缺少必需的标头,返回的最合适的 HTTP 状态代码是啥?

Posted

技术标签:

【中文标题】如果缺少必需的标头,返回的最合适的 HTTP 状态代码是啥?【英文标题】:What is the most appropriate HTTP status code to return if a required header is missing?如果缺少必需的标头,返回的最合适的 HTTP 状态代码是什么? 【发布时间】:2012-05-21 13:23:08 【问题描述】:

我阅读了What HTTP status response code should I use if the request is missing a required parameter?,但它没有专门询问标题,似乎也没有达成共识。

此问题的上下文假定身份验证成功。我目前偏爱 400(尽管这感觉不对,因为这不是“格式错误的语法”)或 403。鉴于 403 的描述:

服务器理解请求,但拒绝执行。 授权将无济于事,并且不应重复请求。 如果 请求方法不是 HEAD 并且服务器希望公开 为什么请求没有被满足,它应该描述原因 对于实体的拒绝。

这对我来说最有意义。

有人可以请教我吗?谢谢。

【问题讨论】:

【参考方案1】:

400 错误请求

这是请求中的用户错误。与 403 不同,客户端应该被允许重复他们的请求,但只能在修改之后:

10.4.1 400 Bad Request 由于语法错误,服务器无法理解该请求。客户端不应该不加修改地重复请求。

编辑

正如 Mark Reed 在 cmets 中指出的那样,403 表示:“您发送给我的内容没有任何问题。您有适当的授权并且语法有效。我只是不想按照您的要求去做。”

粗体部分简单地说,如果服务器选择,它可以准确地告诉客户端为什么它不想满足请求。

【讨论】:

肯定是 400。如果请求有任何不依赖于服务器状态的问题,那就是 400。如果唯一的问题是在服务器端(“这是一个完美的 cromulent 请求,因为据你所知,但我没心情”),那么你使用 403。 感谢您的反馈,伙计们。 412(前置条件失败)呢? AFAIK HTTP 412 Precondition Failed 保留用于If-MatchIf-Unmodified-Since 标头。

以上是关于如果缺少必需的标头,返回的最合适的 HTTP 状态代码是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如果请求缺少必需的参数,我应该使用啥 HTTP 状态响应代码?

当请求 API 的自定义标头错误时,将 http 状态代码设置为 417

当 http 状态不是 200 时,Slim 框架不发送 http 标头

Azure API 响应中缺少速率限制标头

对http://repo1.maven.org/maven2/的请求返回501 HTTPS必需的状态和主体

错误“找不到 Boost”(缺少:上下文标头)