【发布时间】:2011-03-04 07:00:50
【问题描述】:
我在想 412(前提条件失败)但可能有更好的标准?
【问题讨论】:
-
412 肯定是错的
我在想 412(前提条件失败)但可能有更好的标准?
【问题讨论】:
基于spec,状态 422 似乎最合适。
422 (Unprocessable Entity) 状态码表示服务器 理解请求实体的内容类型(因此 415(不支持的媒体类型)状态码不合适),并且 请求实体的语法是正确的(因此是 400 (Bad Request) 状态码不合适)但无法处理包含的 指示。例如,如果 XML 请求正文包含格式正确(即语法正确),但是 语义错误的 XML 指令。
他们指出格式错误的 xml 是一个错误语法的例子(要求 400)。格式错误的查询字符串似乎与此类似,因此 400 似乎不适用于缺少参数的格式良好的查询字符串。
更新 @DavidV 正确指出此规范适用于 WebDAV,而不是核心 HTTP。但是一些流行的非 WebDAV API 仍然使用 422,因为缺少更好的状态码 (see this)。
【讨论】:
400比较合适。
我不确定是否有固定标准,但我会使用 400 Bad Request,这是最新的 HTTP 规范(从 2014 年开始)documents as follows:
6.5.1。 400 错误请求
400(Bad Request)状态码表示服务器不能或 由于某些被认为是 客户端错误(例如,格式错误的请求语法、无效请求 消息框架或欺骗性请求路由)。
【讨论】:
400 Bad Request 表示协议级别的问题,而不是语义错误。如果我们要劫持 HTTP 状态码来指示应用程序级(而不是协议级)错误,为什么不直接使用412?
.NET 中的WCF API 在使用webHttpBinding 时通过返回HTTP 404“未找到端点”错误来处理丢失的参数。
如果您考虑 Web 服务方法名称及其参数签名,404 Not Found 会很有意义。也就是说,如果你暴露了一个 Web 服务方法 LoginUser(string, string) 并且你请求了 LoginUser(string),那么后者是找不到的。
基本上,这意味着您正在调用的 Web 服务方法以及您指定的参数签名无法找到。
10.4.5 404 未找到
服务器没有找到任何匹配 Request-URI 的东西。不 指示该状况是暂时的还是 永久的。
400 Bad Request 和Gert suggested 一样,仍然是有效的响应代码,但我认为它通常用于指示较低级别的问题。它很容易被解释为格式错误的 HTTP 请求,可能是 HTTP 标头丢失或无效,或类似情况。
10.4.1 400 错误请求
由于格式错误,服务器无法理解请求 句法。客户端不应该重复请求 修改。
【讨论】:
您可以发送 400 Bad Request 代码。它是更通用的 4xx 状态代码之一,因此您可以使用它来表示您的意图:客户端发送的请求缺少您的应用程序正确处理它所需的信息/参数。
【讨论】:
如果所需参数中的某些内容与 API 端点所需的内容不匹配(例如密码太短),我通常会选择 422(无法处理的实体),但对于缺少的参数,我会选择 406(不可接受)。
【讨论】:
Accept-Language: de,表示它只接受德语响应,但您的服务器可用的请求文档的唯一版本是英语或法语。)使用它来表示请求中缺少参数不正确,根据规范中的定义。
在我们的一个 API 项目中,我们决定为某个请求设置 409 状态,但由于缺少参数而无法以 100% 填充它。
HTTP 状态代码“409 冲突”对我们来说是一个很好的尝试,因为它是定义 需要包含足够的信息让用户识别 冲突的根源。
因此,在 400 或 404 等其他响应中,我们选择了 409 来强制查看请求中的一些注释,这有助于设置新的正确请求。
无论如何,我们的案例都是特殊的,因为如果请求不完全正确,我们需要在前夕发送一些数据,并且我们需要强制客户端查看消息并了解请求中的错误。
一般来说,如果我们只有一些缺失参数,我们会选择 400 和一组缺失参数。但是,当我们需要发送更多信息(例如特定案例消息)并且我们希望更确定客户会处理它时,我们会发送 409
【讨论】:
对于那些感兴趣的人,Spring MVC(至少 3.x)在这种情况下返回 400,这对我来说似乎是错误的。
我测试了几个 Google 网址 (accounts.google.com) 并删除了所需的参数,在这种情况下它们通常返回 404。
我会复制谷歌。
【讨论】:
可以说应该使用404 Not Found,因为找不到指定的资源。
【讨论】:
我经常使用 403 Forbidden 错误。原因是请求被理解,但我不会按要求去做(因为事情是错误的)。响应实体解释了问题所在,因此如果响应是 HTML 页面,则错误消息在页面中。如果是 JSON 或 XML 响应,则错误信息在其中。
来自rfc2616:
10.4.4 403 禁止
服务器理解请求,但拒绝执行。
授权将无济于事,并且不应重复请求。
如果请求方法不是 HEAD 并且服务器希望进行
公开为什么请求没有得到满足,它应该描述 实体拒绝的原因。如果服务器不希望 将此信息提供给客户端,状态码 404
(未找到)可以代替。
【讨论】:
Authorization will not help,所以 Twitter 不应该为无效的 OAuth 凭据发送这个。
401 Unauthorized。但是,如果您查看这两个非常相似的代码中的the MDN docs' descriptions,您就可以理解它们为什么不这样做。