协慌网

登录 贡献 社区

REST HTTP 状态代码,用于验证失败或重复无效

我正在使用基于 REST 的 API 构建一个应用程序,并且已经达到了为每个请求指定状态代码的程度。

对于未通过验证的请求或请求尝试在我的数据库中添加副本的情况,我应该发送什么状态代码?

我查看了http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html,但似乎没有一个是正确的。

发送状态代码时是否有通用做法?

答案

对于输入验证失败: 400 Bad Request + 您的可选说明。这在 “ RESTful Web Services ” 一书中有所建议。对于双提交: 409 冲突


2014 年 6 月更新

相关规范曾经是RFC2616 ,它使用了 400(差错请求)

由于语法格式错误,服务器无法理解请求

因此可能有人认为它不适合语义错误。但不是更多; 自 2014 年 6 月起,相关标准RFC 7231 (取代之前的 RFC2616 更广泛地使用400(错误请求)

由于被认为是客户端错误的东西,服务器不能或不会处理请求

  • 验证失败:403 Forbidden(“服务器理解请求,但拒绝履行请求”)。与流行的观点相反,RFC2616 没有说 “403 仅用于失败的身份验证”,但 “403:我知道你想要什么,但我不会这样做”。该条件可能是也可能不是由于身份验证。
  • 尝试添加副本:409 Conflict(“由于与资源的当前状态冲突,无法完成请求。”)

您应该在响应标头和 / 或正文中提供更详细的说明(例如,使用自定义标头 - X-Status-Reason: Validation failed )。

我建议使用状态码 422,“Unprocessable Entity”

11.2。 422 不可处理的实体

422(不可处理实体)状态代码表示服务器理解请求实体的内容类型(因此 415(不支持的媒体类型)状态代码是不合适的),并且请求实体的语法是正确的(因此 400(错误请求) )状态代码不合适)但无法处理包含的指令。例如,如果 XML 请求主体包含格式正确(即语法正确)但语义错误的 XML 指令,则可能发生此错误情况。