400 Bad Request现在似乎是用例中最好的HTTP/1.1状态代码。
在你提出问题(以及我最初的回答)的时候,RFC 7231还不存在;在这一点上,我反对400坏请求,因为RFC 2616说(强调我的):
由于语法错误,服务器无法理解请求。
并且您描述的请求是语法上有效的JSON,封装在语法上有效的HTTP中,因此服务器对请求的语法没有任何问题。
然而,正如Lee Saferite在评论中指出的那样,RFC 7231取代了RFC 2616,不包括这个限制:
400(坏请求)状态码表示服务器不能或不愿处理请求,原因是客户机错误(例如,格式错误的请求语法、无效的请求消息框架或欺骗性的请求路由)。
然而,在重新措辞之前(或者如果你想争论RFC 7231现在只是一个提议的标准),422不可处理实体对于你的用例来说似乎不是一个不正确的HTTP状态代码,因为RFC 4918的介绍说:
而HTTP/1.1提供的状态码足以
描述WebDAV方法遇到的大多数错误条件
是一些不能完全归入现有类别的错误。
该规范定义了为WebDAV开发的额外状态代码
方法(第11节)
422页的描述说
422(不可处理实体)状态码表示服务器
理解请求实体的内容类型(因此是
415(不支持的媒体类型)状态码不合适)
请求实体的语法是正确的(因此是400(坏请求)
状态码不合适),但无法处理包含的
指令。
(注意对语法的引用;我怀疑7231也部分淘汰了4918)
这听起来和你的情况一模一样,但以防你有任何疑问,它接着说:
例如,如果XML
请求主体包含格式良好的(即语法正确),但是
语义错误的XML指令。
(将“XML”替换为“JSON”,我想我们可以同意这是你的情况)
现在,有些人会反对RFC 4918是关于“Web分布式编写和版本控制(WebDAV)的HTTP扩展”,你(大概)没有做任何涉及WebDAV的事情,所以不应该使用它。
如果要在使用原始标准中明确不包含该情况的错误代码和使用来自扩展的准确描述该情况的错误代码之间做出选择,我会选择后者。
此外,RFC 4918第21.4节引用了IANA超文本传输协议(HTTP)状态码注册表,其中可以找到422。
我建议HTTP客户端或服务器使用来自该注册中心的任何状态代码是完全合理的,只要它们正确地这样做。
但是对于HTTP/1.1, RFC 7231有吸引力,所以只使用400个坏请求!