我已经阅读了很多关于正确的 http 状态代码以返回客户端请求错误的帖子和文章。其他人建议使用 400,因为它已在RFC 7231中重新定义,但我不确定给出的示例是否涵盖了我脑海中的所有客户端错误,因为这些示例是句法的。
400 (Bad Request) 状态码表示服务器不能或不会处理请求,因为某些东西被认为是客户端错误(例如,格式错误的请求语法、无效的请求
消息帧或欺骗性请求路由)。
我确实在 rfc 7231 的附录 B 中找到了这个声明:
400(错误请求)状态代码已放宽,因此它
不限于语法错误。(第 6.5.1 节)
这是否意味着我可以将任何类型的客户端错误视为错误请求?将 400 用于客户端请求并在消息中指定更具体的错误会更好吗?
另一方面,其他人说最好使用 422 (Unprocessable Entity)。虽然这更侧重于语义,但它只列在 [RFC 4918][2] 中,它是 http/1.1 的 webDAV 扩展
422(Unprocessable Entity)状态码意味着服务器
理解请求实体的内容类型(因此
415(Unsupported Media Type)状态码是不合适的),并且
请求实体的语法是正确的(因此是 400(Bad Request) )
状态码不合适)但无法处理包含的指令。例如,如果 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 api 错误,但它们没有使用 422。另一方面,Twitter 使用 422。我比以往任何时候都更加困惑。< 虽然我的一部分人认为 400 是更好的选择,因为它包含在内在 RFC 文档中,422 不是。不过我可能是错的。