http - REST http的状态代码: 验证失败或者无效的重复

  显示原文与译文双语对照的内容

我正在构建一个带有 REST-based API的应用程序,并已经开始为每个请求指定状态代码。

对于失败的验证或者请求试图在数据库中添加副本的位置,我应该发送哪些状态代码?

我已经查看了 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html web,但它们似乎都不正确。

发送状态代码时是否有常见实践?

时间:

输入验证失败:400错误请求 + 你的可选描述。 这在书" RESTful Web服务 编辑器"中推荐。 对于双提交:409冲突


更新 2014年06月

相关的规范是 RFC2616,它给出了 400 ( 错误的请求)的使用

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

于语义errors,相关所以可能一直这样说,那是 inappropriate. 但现在没有了;因为 2014年06月的相关标准 RFC 7231,它取代了前一个 RFC2616,使得 400 ( 错误的请求) 更广泛

由于被认为是客户端错误,服务器无法或者不会处理请求

  • 验证失败:403禁用了(",服务器理解请求,但拒绝") 。 流行的观点相反,RFC2616不说" 403只用于失败的身份验证",而是"403: 我知道你想要什么,但我不会这样做。 这种情况可能是由于认证而导致的。
  • 试图添加副本: 409冲突("由于与资源当前状态冲突,请求无法完成。")

你应该在响应头和/或者正文中给出更详细的解释( 例如。 使用自定义标头- X-Status-Reason: Validation failed

200,300,400,500都非常通用。 如果你想要通用,400就可以了。

422被越来越多的api使用,甚至由 Rails 使用。

无论你为你的API选择哪种状态代码,有人都会不同意。 我喜欢 422,因为我认为'400 + 文本状态'太通用了。 另外,你没有利用JSON-ready解析器;相反,带有JSON响应的422是非常明确的,并且可以传递大量的错误信息。

谈到JSON响应,我倾向于标准化这个案例的Rails 错误响应,它是:


{
"errors" :
 { 
"arg1" : ["error msg 1","error msg 2",.. .]
"arg2" : ["error msg 1","error msg 2",.. .]
 }
}

这种格式对于表单验证来说是完美的,我认为它是支持'错误报告时出错'的最复杂的例子。 如果你的错误结构是这样,它可能会处理你所有的错误报告需求。

状态代码 304未修改 。也将对重复请求作出可以接受的响应。 这类似于使用实体标记处理 If-None-Match的头。

在我看来,答案很 @Piskvor's 更明显的选择,我所感觉到是原来的问题了,但我有一个替代的意图,也是相关的。

如果你想将重复的请求视为警告或者通知而不是错误,304的响应状态代码将不会被修改,并且识别现有资源的Content-Location 头将是有效的。 当目的仅仅是确保资源存在时,重复的请求不会是错误,而是确认。 请求不是错误的,但只是多余的,客户端可以引用现有资源。

换句话说,请求是好的,但是由于资源已经存在,服务器不需要执行任何进一步的处理。

ember-data适配器的ActiveRecord期望从服务器返回 422 UNPROCESSABLE ENTITY 。 因此,如果你的客户端是用 Ember.js 编写的,你应该使用 422. 只有在 DS.Errors 之后,返回的错误才会被填充。 当然可以将 422更改为适配器中的任何其他代码

...