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

400对422对数据发布的响应

羊时铭
2023-03-14
{
    "account_number": 45645511,
    "upc": "00490000486",
    "price": 1.00,
    "tax": 0.08
}

如果客户端发送给我“sales_tax”(而不是预期的“tax”),我应该返回什么。目前,我正在退回400英镑。但是,我开始质疑自己。我真的应该还422吗?我的意思是,它是JSON(它是受支持的),它是有效的JSON,它只是不包含所有必需的字段。

共有1个答案

国兴贤
2023-03-14

400错误请求现在似乎是您用例的最佳HTTP/1.1状态代码。

在您提出问题(以及我最初的回答)时,RFC7231还不是一件事;当时我反对400错误请求,因为RFC2616说(强调了我的):

由于语法错误,服务器无法理解请求。

400(Bad Request)状态代码指示服务器由于被认为是客户端错误(例如,错误的请求语法、无效的请求消息帧或欺骗性的请求路由)而不能或不会处理请求。

但是,在重新措辞之前(或者如果您想对RFC 7231只是当前建议的标准提出质疑),422 Unprocessable entity对于您的用例来说似乎并不是一个不正确的HTTP状态代码,因为正如RFC 4918的导言所说:

虽然HTTP/1.1提供的状态代码足以描述WebDAV方法遇到的大多数错误情况,但有些错误并不完全属于现有的类别。本规范定义了为WebDAV方法开发的额外状态代码(第11节)

422的说明是:

422(不可处理的实体)状态代码意味着服务器理解请求实体的内容类型(因此415(不支持的媒体类型)状态代码是不合适的),并且请求实体的语法是正确的(因此400(错误请求)状态代码是不合适的),但是无法处理包含的指令。

(注意语法的引用;我怀疑7231也部分地过时了4918)

(将“XML”替换为“JSON”,我想我们可以同意这是您的情况)

现在,有些人会反对RFC4918是关于“Web分布式创作和版本控制(WebDAV)的HTTP扩展”,并且您(大概)没有做任何涉及WebDAV的事情,因此不应该使用它的东西。

在使用原始标准中的错误代码和扩展中的错误代码之间进行选择,前者显式地不覆盖这种情况,后者精确地描述了这种情况,我会选择后者。

此外,RFC 4918第21.4节提到了IANA超文本传输协议(HTTP)状态代码注册表,其中可以找到422。

我建议HTTP客户端或服务器使用该注册表中的任何状态代码是完全合理的,只要它们正确地这样做。

但是在HTTP/1.1中,RFC 7231具有牵引力,因此只需使用400 Bad request

 类似资料:
  • 我正在尝试用一个“类似REST”的API在不同的场景中返回什么正确的状态代码。 这个例子借用了另一个关于正文中语法类型问题的问题,但是我的问题假设整个语法都是有效的。 null 这些都是阻止“处理”发生的业务层问题,然而,有一个场景涉及到GET中的404。 注意账号不在URL中,那么404是不是误导人呢?

  • 我读了很多关于正确的超文本传输协议状态代码返回客户端请求错误的帖子和文章。其他人建议使用400,因为它在RFC 7231中被重新定义了,尽管我不确定给出的例子是否涵盖了我脑海中所有的客户端错误,因为这些例子是语法性的。 400(错误请求)状态代码表示服务器无法或将不会处理请求,原因是被认为是客户端错误(例如,格式错误的请求语法、无效的请求 消息帧或欺骗性请求路由)。 我确实在rfc 7231的附录

  • 我想发布api.discogs.com/marketplace/listings?...在爪哇。 当我试图创建一个新的列表帖子时,结果是“返回了一个响应状态为422 null”。 谢谢大家!

  • 问题内容: 我已经开始尝试使用Django REST框架。到目前为止,我已经成功地为我的对象创建了一个序列化程序,通过Javascript的$ .post()创建了发布视图,发布对象和返回对象。因此,现在我可以在JSON和Django模型对象之间进行适当的转换。 问题是我有一个对象数组[A1,A2,…,An]。现在,当我需要发布这样的数组时,我逐个对象地进行处理。是否有可能一次发布整个数组,并在D

  • 问题内容: 我正在尝试将JSON发布到WCF服务。json对象包含一个数组。我想知道如何正确绑定到我的数据合同。如果有人可以在这里给我指点,我将不胜感激。目前,我的购物车对象为null 我的服务界面如下所示: 我的客户电话如下 客户电话 我的JSON看起来像这样 问题答案: Fiddler对WCF REST方法的原始请求应如下所示: JSON中的响应如下所示:

  • 我有一个。Net Core 5控制台应用程序在Orange Pi上的Linux(Debian 10)上运行。我正在尝试将一些JSON发布到Web API(也写在. Net Core 5中并托管在Azure应用服务上)API有两个HTTPPOSTendpoint-一个用于接收单个对象,另一个几乎相同的endpoint用于接收所述对象的数组。 当我将单个对象发布到第一个endpoint时,我会收到20