繁体   English   中英

400 和 422 HTTP 状态码的区别

[英]Difference between 400 and 422 HTTP status codes

如果 HTTP 请求负载缺少必需属性,响应代码必须是 400 或 422,有很多讨论。

我还不清楚其中的区别。

请使用逻辑场景/示例建议何时使用 400 或 422 HTTP 状态代码。

我知道这个问题已经有将近一年的历史了,但我想我会根据我自己在近 400 个微服务中设计和构建一个非常大的 API 域的经验添加一个答案。

理想情况下,API 应遵循 Postel 定律并对其接收的内容保持宽容。 这帮助我们澄清了何时使用400以及何时使用422

在上面的答案中,我们将示例 400 响应视为 422 响应。 为什么? 因为我们可以通过忽略它来容忍“未知”属性。 但是缺少必需的<date>字段,因此我们将返回一个 422,其中包含一个错误指示。

如果消费者通过application/xml内容类型下的 JSON 有效负载发送或 XML 请求无效(即,他们具有<date>2020-01-07</dat>字段),则会引发 400 响应。

这种方法给我们带来的一个优势是,我们可以为 422 个响应定义不同的响应契约,同时允许 400 个响应保持一个相当通用的“你想问的 WTF?” 回应。 我们的422个回应包含列出每个请求限制或要求已被打破错误信息的集合

我们还发现这种方法对于我们的 UX 人员特别有用,他们可以向 API 提交表单并返回带有人类可读错误的响应,他们可以直接映射回表单字段(即点击提交但未填写)必填字段将生成 422 响应,其中包含一条消息,说明该属性是必需的)。

据我所知,400 用于语法错误的请求,422 用于语义错误的请求。 如果您期望像这样的请求

...
  <name>test name</name>
  <date>2020-01-07</date>
...

400 将是:

...
  <name>test name</name>
  <dateString>2020-01-07</dateString>
...

422 将是:

...
  <name>test name</name>
  <date>hello</date>
...

我只使用 400,因为HTTP/1.1 RFC7231 中没有定义 422

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM