我读过很多关于正确的http状态代码以返回客户端请求错误的文章和文章。其他人建议使用400,因为它已经在RFC 7231中重新定义了,不过我不确定给出的示例是否涵盖了我心目中的所有客户端错误,因为示例是语法。
400 (坏请求)状态代码表示服务器无法或不处理请求,原因是被认为是客户端错误(例如,格式错误的请求语法、无效请求)。 消息帧,或欺骗性请求路由)。
我确实在rfc 7231的附录B中找到了这一声明:
400 (坏请求)状态代码已被放松,因此它不是 仅限于语法错误。(第6.5.1条)
这是否意味着我可以将任何类型的客户端错误视为错误请求?对客户端请求使用400,并在消息中指定一个更具体的错误更好吗?
另一方面,其他人则认为使用422 (非可处理实体)更好。虽然这更侧重于语义,但它只在RFC 4918中列出,这是http/1.1的webDAV扩展
422 (不可处理实体)状态代码是指服务器。 理解请求实体的内容类型(因此 415(不支持媒体类型)状态代码不合适), 请求实体的语法是正确的(因此是一个400 (不好的请求) 状态代码是不合适的),但无法处理包含的指令。例如,如果使用XML,则可能出现此错误情况。 请求体包含格式良好的(即语法正确),但是 语义错误的XML指令。
我可以使用这个webDAV扩展代码来处理我的http请求吗?在422的例子中,即使它不在核心http代码中,我也能使用它吗?
对于我的客户错误,我应该使用400还是422?
下面是我所想到的可能的客户端错误:
1.) Invalid parameter. The client provided parameters but are found invalid. Example: I said that the userId is 1, but when I checked there's no userId of 1. Another example of invalid parameter is wrong data type.
2.) Missing required parameters
3.) Let's say I need to hash a value based on given params and it failed
4.) Blocked content is being used. Like, i want to apply for membership and i passed the userId of 1. However, userId of one is blocked / deactivated
5.) When I try to delete an entry but the entry is still being used in another table.
6.) Let's say i require a signature in my payload and the signature does not match when recalculated in the backend
7.) Let's say I have a value that counts a specific attribute like "shares" and it has reached the maximum value like 10.
etc...
如有任何内容详实的答复,将不胜感激。非常感谢,伙计们!
更新:我检查了google错误,它们没有使用422。另一方面,Twitter使用422。我比以往任何时候都更加困惑的>.<,虽然有一部分我认为400是更好的选择,因为它包括在RFC文档和422不是。不过我可能错了。
发布于 2018-08-30 13:47:07
我可以使用这个WebDAV扩展代码来处理我的HTTP请求吗?对于
422,即使它不在核心HTTP代码中,我也能使用它吗?
HTTP是一个可扩展的协议,422是在IANA注册,这使得它成为一个标准的状态代码。因此,没有什么可以阻止您在应用程序中使用422。
自2022年6月以来,422在RFC 9110中定义,该文档目前定义了HTTP协议的语义:
作为参考,下面是如何定义422的方法:
15.5.21。422个不可处理内容
422(不可处理内容)状态代码指示服务器理解请求内容的内容类型(因此415(不支持的媒体类型)状态代码不合适),请求内容的语法是正确的,但无法处理包含的指令。例如,如果XML请求内容包含格式良好(即语法正确)但语义错误的XML指令,则可以发送此状态代码。
在RFC 4918中定义时,422的原因短语是“不可处理的实体”。因为它是添加到RFC 9110中的,所以它的原因短语是“不可处理的内容”。
对于我的客户端错误,我应该使用
400还是422?
你当然可以两样都用。通常,使用400表示有效负载中的语法错误或URL中的无效参数。并使用422表示有效负载中的语义问题。
作为一个示例,请参阅GitHub v3 API使用的GitHub v3 API
客户端错误 在接收请求主体的API调用上有三种可能类型的客户端错误:
400不良请求响应。
HTTP/1.1 400坏请求内容-长度: 35 {“消息”:“解析JSON的问题”}400糟糕的请求响应。
HTTP/1.1 400坏请求内容-长度: 40 {"message":"Body应该是JSON对象“}422不可处理实体响应。
HTTP/1.1 422不可处理实体内容-长度: 149 {“消息”:“验证失败”,“错误”:{“资源”:“问题”,“字段”:“标题”,“代码”:"missing_field“}选择最合适的4xx状态代码
迈克尔·克洛巴特组合了一个一组决策图表,帮助确定每种情况的最佳状态代码。有关4xx状态代码,请参见以下内容:

HTTP的问题详细信息
HTTP状态代码有时不足以传递关于错误的足够信息以提供帮助。RFC 7807定义了简单的JSON和XML格式,以通知客户机HTTP中的问题。这是在API中报告错误的一个很好的起点。
它还定义了application/problem+json和application/problem+xml媒体类型。
https://stackoverflow.com/questions/51990143
复制相似问题