首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >400 vs 422用于客户端错误请求

400 vs 422用于客户端错误请求
EN

Stack Overflow用户
提问于 2018-08-23 16:14:03
回答 1查看 11.9K关注 0票数 22

我读过很多关于正确的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?

下面是我所想到的可能的客户端错误:

代码语言:javascript
复制
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不是。不过我可能错了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-30 13:47:07

我可以使用这个WebDAV扩展代码来处理我的HTTP请求吗?对于422,即使它不在核心HTTP代码中,我也能使用它吗?

HTTP是一个可扩展的协议,422在IANA注册,这使得它成为一个标准的状态代码。因此,没有什么可以阻止您在应用程序中使用422

自2022年6月以来,422RFC 9110中定义,该文档目前定义了HTTP协议的语义:

状态代码422 (以前在RFC 4918的11.2节中定义)是由于它的一般适用性而添加的。

作为参考,下面是如何定义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调用上有三种可能类型的客户端错误:

  1. 发送无效的JSON将导致400不良请求响应。 HTTP/1.1 400坏请求内容-长度: 35 {“消息”:“解析JSON的问题”}
  2. 发送错误类型的JSON值将导致400糟糕的请求响应。 HTTP/1.1 400坏请求内容-长度: 40 {"message":"Body应该是JSON对象“}
  3. 发送无效字段将导致422不可处理实体响应。 HTTP/1.1 422不可处理实体内容-长度: 149 {“消息”:“验证失败”,“错误”:{“资源”:“问题”,“字段”:“标题”,“代码”:"missing_field“}

选择最合适的4xx状态代码

迈克尔·克洛巴特组合了一个一组决策图表,帮助确定每种情况的最佳状态代码。有关4xx状态代码,请参见以下内容:

HTTP的问题详细信息

HTTP状态代码有时不足以传递关于错误的足够信息以提供帮助。RFC 7807定义了简单的JSON和XML格式,以通知客户机HTTP中的问题。这是在API中报告错误的一个很好的起点。

它还定义了application/problem+jsonapplication/problem+xml媒体类型。

票数 52
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51990143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档