当前位置: 首页 > 知识库问答 >
问题:

400对422,用于客户端错误请求

东方俊力
2023-03-14

我读了很多关于正确的超文本传输协议状态代码返回客户端请求错误的帖子和文章。其他人建议使用400,因为它在RFC 7231中被重新定义了,尽管我不确定给出的例子是否涵盖了我脑海中所有的客户端错误,因为这些例子是语法性的。

400(错误请求)状态代码表示服务器无法或将不会处理请求,原因是被认为是客户端错误(例如,格式错误的请求语法、无效的请求
消息帧或欺骗性请求路由)。

我确实在rfc 7231的附录B中找到了这句话:

400(错误请求)状态代码已经放松,因此它不限于语法错误。(第6.5.1节)

这是否意味着我可以将任何类型的客户端错误视为错误请求?对于客户端请求使用400并在消息中指定一个更具体的错误会更好吗?

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

我可以使用这个webDAV扩展代码来处理我的超文本传输协议请求吗?在422的情况下,我可以使用它,即使它不在核心超文本传输协议代码中。

我的客户端错误应该使用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...

更新:我检查了谷歌api错误,他们没有使用422。另一方面,Twitter使用422。我比以前更困惑了

共有1个答案

孙德本
2023-03-14

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

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

我应该使用400还是422处理我的客户端错误?

这要看情况,但你可以两者都用。通常,使用400来指示有效负载中的语法错误或URL中的无效参数。并使用422来指示有效载荷中的语义问题。

例如,请参阅GitHub v3 API使用的方法:

客户端错误

接收请求主体的API调用上可能存在三种类型的客户端错误:

>

  • 发送无效的JSON将导致400错误的请求响应。

     HTTP/1.1 400 Bad Request
     Content-Length: 35
    
     {"message":"Problems parsing JSON"}
    

    发送错误类型的JSON值将导致400错误的请求响应。

     HTTP/1.1 400 Bad Request
     Content-Length: 40
    
     {"message":"Body should be a JSON object"}
    

    发送无效字段将导致422无法处理的实体响应。

     HTTP/1.1 422 Unprocessable Entity
     Content-Length: 149
    
     {
       "message": "Validation Failed",
       "errors": [
         {
           "resource": "Issue",
           "field": "title",
           "code": "missing_field"
         }
       ]
     }
    

    迈克尔·克罗帕特(Michael Kropat)整理了一组决策图,帮助确定每种情况下的最佳状态代码。有关4xx状态代码,请参见以下内容:

    HTTP状态代码有时不足以传达足够的错误信息。RFC 7807定义了简单的JSON和XML文档格式,以告知客户端HTTP API中的问题。这是在API中报告错误的一个很好的起点。

    它还定义了应用程序/问题json应用程序/问题xml媒体类型。

  •  类似资料:
    • 在我的代码中,我试图反复构建一个客户端,并向远程endpoint发送一个输入流: 输入流包含消息的xml正文。我注意到在第一次迭代中。。。请求成功第二次迭代响应为400错误请求。。。第三个400错误请求。。。。等等。。。 如果我将输入流更改为字符串...获取真实的xml并用PUT方法发送它。 有什么区别?为什么它可以处理字符串而不能处理输入流?(似乎inputstream在第一次迭代后会发生变化)

    • 我试图自动化Web服务,并以字符串的形式传递XML,然后将其转换为字符串实体并设置实体。但我不知道为什么会抛出400错误。我是WebServices Automation的新手,请在这方面帮助我。 以下是我的代码:

    • 我试图建立一个连接器从谷歌云下载文件。为此,我使用云存储API客户端库Java(v1beta2-rev23-1.17.0-rc) 我正在使用oAuth2.0,并遵循云控制台帮助中提到的步骤。 验证我可以通过gsutil和api浏览器访问我的桶。 从示例下载了代码,添加了我的client_secrets.json并添加了一行来列出我的桶内容。 我犯了一个错误 400错误请求:“错误”:“未经授权的\

    • YouTube官方网站经常出错。如果我尝试,它在匿名模式下工作。这说明问题是由浏览器上的cookie/cache/localstorage/application数据引起的。 如果我删除数据,它将再次开始工作,但是,我将需要在我使用的所有gmail帐户中再次登录。 我已经要求谷歌(在反馈和推特上)对此进行调查,但他们无能为力。 因此,问题是: 如果有人遇到过这个问题,您是否已经了解了为什么以及如何

    • 我正在尝试对客户端凭据流进行身份验证,但一直返回错误400。我查看了可用的API,但看不出我做错了什么。如果有人能给我一个正确的方向,那太棒了。谢谢

    • 我可以捕获400的错误代码并输出一个自定义错误,但我肯定我一定做错了,从Mailchimp API得到如此无益的响应? 非常感谢,安迪和所有的帮助都很感激。