未通过validation的REST HTTP状态代码或无效重复

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

我应该发送什么状态代码来validation请求失败,或者请求正在尝试在我的数据库中添加重复项?

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

发送状态码时是否有通常的做法?

对于inputvalidation失败: 400错误的请求 +您的可选描述。 这是在“ REST风格的Web服务 ”一书中build议的。 双提交: 409冲突


2014年6月更新

相关的规范曾经是RFC2616 ,它使用了400(错误请求)而非狭义的

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

所以可能有人认为这是不适合的语义错误。 但不再是; 自2014年6月起,相关标准RFC 7231取代了以前的RFC2616,更广泛地使用了400(Bad Request)

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

  • validation失败:403禁止(“服务器理解请求,但拒绝履行)”。 与stream行的观点相反,RFC2616没有说“403只是用于失败的authentication”,而是“403:我知道你想要什么,但是我不会这样做”。 这种情况可能会或可能不会由于身份validation。
  • 尝试添加一个副本:409冲突(“由于与资源的当前状态发生冲突,请求无法完成”)

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

我推荐状态码422,“不可处理的实体” 。

11.2。 422不可处理的实体

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

200,300,400,500都是非常通用的。 如果你想通用,400是确定的。

422被越来越多的API使用,甚至被开箱即用的Rails使用。

无论您select哪种状态码,都会有人不同意。 但我更喜欢422,因为我认为“400 +文本状态”太泛化了。 另外,您还没有充分利用JSON就绪parsing器。 相反,具有JSON响应的422非常明确,并且可以传达大量的错误信息。

说到JSON响应,我倾向于在这种情况下对Rails错误响应进行标准化,即:

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

这种格式非常适用于表单validation,在“错误报告丰富性”方面,我认为这是最复杂的情​​况。 如果你的错误结构是这样,它可能会处理你所有的错误报告需求。

数据库中的副本应该是409 CONFLICT

我build议使用422 UNPROCESSABLE ENTITY来validation错误。

我在这里给出了4xx代码的更长的解释: http : //parker0phil.com/2014/10/16/REST_http_4xx_status_codes_syntax_and_sematics/

未修改的状态码304也会对重复请求做出可接受的响应。 这与使用实体标签处理If-None-Match的头部类似。

在我看来,@ Piskvor的回答是我认为是原始问题意图的更明显的select,但是我有一个也是相关的替代scheme。

如果您想将重复请求视为警告或通知而不是错误,则标识现有资源的响应状态代码304 Not Modified和Content-Location标题将同样有效。 当意图仅仅是确保资源存在时,重复请求不会是错误而是确认。 请求没有错,但是简单多余,客户端可以参考现有的资源。

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

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

200

呃…(309,400,403,409,415,422)…很多答案试图猜测,争辩和标准化什么是成功的http请求的最佳返回码,但失败的rest呼叫

混合HTTP协议代码和REST结果是错误的

但是,我看到很多的实现混合在一起,很多开发者可能不同意我的看法。

HTTP返回码与HTTP Request本身相关。 REST调用是使用超文本传输​​协议请求完成的,它的工作级别低于调用的REST方法本身。 REST是一个概念/方法,其输出是商业/逻辑结果,而HTTP结果代码是一个传输

例如,当你调用/ users /时会返回“404 Not Found”,因为这可能意味着:

  • URI是错误的(HTTP)
  • 没有find用户(REST)

“403禁止/拒绝访问”可能意味着:

  • 需要特别许可。 浏览器可以通过询问用户/密码来处理它。 (HTTP)
  • 在服务器上configuration错误的访问权限。 (HTTP)
  • 您需要进行身份validation(REST)

并且该列表可能会继续以“500服务器错误”(REST中的Apache / Nginx HTTP抛出错误或业务约束错误)或其他HTTP错误等。

从代码中,很难理解什么是失败原因,HTTP(传输)失败或REST(逻辑)失败。

如果HTTP请求在物理上执行成功,则应始终返回200代码,无论是否findlogging。 因为URI资源被find并由http服务器处理。 是的,它可能会返回一个空集。 是否有可能收到一个空的网页与200作为http结果,对不对?

而不是这个,你可能会返回200 HTTP代码的一些选项:

  • JSON结果中的“错误”对象,如果出现问题
  • 如果没有findlogging,则清空JSON数组/对象
  • 布尔结果/成功标志与以前的选项相结合,以获得更好的处理。

此外,一些互联网提供商可能会拦截您的请求,并返回您的404 http代码。 这并不意味着你的数据没有find,但是在传输层面是错误的。

来自Wiki :

2004年7月,英国电信提供商英国电信集团(BT Group)部署了Cleanfeed内容拦截系统,该系统返回404错误,以回应任何被互联网观察基金会认定为非法内容的请求。 其他ISP在相同情况下返回HTTP 403“禁止”错误。 泰国和突尼斯也曾报道过使用伪造的404错误作为隐藏审查的手段。 在2011年革命前审查严重的突尼斯,人们意识到伪造的404错误的性质,并创造了一个名为“Ammar 404”的虚构angular色,代表“隐形审查员”。

为什么不简单地回答这样的事情呢?

 { "result": false, "error": {"code": 102, "message": "Validation failed: Wrong NAME."} }