正确的HTTP状态代码到错误的输入

时间:2011-10-29 13:18:05

标签: api http validation

什么是最佳HTTP响应代码不报告200(一切正常)但输入错误?

就像,您向服务器提交一些数据,它会回复您的数据错误

使用500看起来更像服务器问题 使用带有警告/错误响应文本的200是不好的(允许缓存,一切都不正常) 使用204并且不返回任何东西,可能是好的(但得到很好的支持?)
如果请求的路径(脚本)可用且位置正确,则使用404是错误的

6 个答案:

答案 0 :(得分:143)

我们在制作API时遇到了同样的问题。我们一直在寻找相当于InvalidArgumentException的HTTP状态代码。在阅读下面的源文章后,我们最终使用422 Unprocessable Entity表示:

  

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

来源:https://www.bennadel.com/blog/2434-http-status-codes-for-invalid-data-400-vs-422.htm

答案 1 :(得分:130)

以4(4xx)开头的代码用于客户端错误。也许400(不良请求)可能适合这种情况? http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html中的定义说:

“由于语法错误,服务器无法理解请求。客户端不应该在没有修改的情况下重复请求。”

答案 2 :(得分:13)

答案 3 :(得分:6)

409 Conflict是可以接受的解决方案。

根据:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

  

由于与资源的当前状态冲突,请求无法完成。仅在预期用户可能能够解决冲突并重新提交请求的情况下才允许使用此代码。响应主体应该包含足够的信息,以使用户能够识别冲突的根源。理想情况下,响应实体应包括足够的信息供用户或用户代理解决问题。但是,这可能是不可能的,也不是必需的。

文档以示例继续:

  

响应PUT请求最有可能发生冲突。例如,如果正在使用版本控制,并且正在PUT的实体包含对资源的更改,该更改与先前(第三方)请求所做的更改冲突,则服务器可能会使用409响应来指示它无法完成请求。在这种情况下,响应实体可能会以响应Content-Type定义的格式包含两个版本之间差异的列表。


就我而言,我想通过API将一个必须唯一的字符串放入数据库。在将其添加到数据库之前,我正在检查它是否尚未在数据库中。

如果是,我将返回"Error: The string is already in the database", 409

我相信这就是OP想要的:错误代码,适用于数据未通过服务器标准的情况。

答案 4 :(得分:1)

根据以下情况,

假设某人使用正确格式的数据向您的服务器发出请求,但这些数据根本不是“好”数据。因此,例如,假设有人将String值发布到期望String值的API端点;但是,字符串的值包含被列入黑名单的数据(例如,防止人们使用“密码”作为其密码)。那么状态码可能是400或422?

直到现在,我仍会返回“ 400错误请求”,根据w3.org,这表示:

  

由于格式错误,服务器无法理解该请求   句法。客户端不应在没有以下情况的情况下重复请求   修改。

此描述不太适合这种情况;但是,如果按HTTP / 1.1协议中定义的核心HTTP状态代码列表查找,那可能是最好的选择。

但是,最近,我的开发团队中的某人向[我]指出,流行的API开始使用HTTP扩展来更详细地报告错误。具体来说,许多API(例如Twitter和Recurly)都使用状态代码“ 422无法处理的实体”,如WebDAV的HTTP扩展中所定义。 HTTP状态代码422指出:

  

422(不可处理实体)状态代码表示服务器   了解请求实体的内容类型(因此为415   (不支持的媒体类型)状态码不正确)和语法   的请求实体是正确的(因此,状态码为400(错误请求)   是不合适的),但无法处理其中的内容   说明。例如对于如果XML可能会出现此错误情况   请求正文包含格式正确(即语法正确)的内容,但   语义错误的XML指令。

从上面回到我们的密码示例,此422状态代码感觉更合适。服务器了解您要执行的操作;并且它了解您提交的数据;只是不允许处理这些数据。

答案 5 :(得分:-7)

404 - Not Found - 可用于请求的URI无效或请求的资源(如用户)不存在。