对于您的用例,400错误请求现在似乎是最好的HTTP / 1.1状态代码。
在提出问题时(和我的原始答案),RFC 7231并不是问题。当时我反对,400 Bad Request
因为RFC 2616表示(重点是我的):
由于语法格式错误,服务器无法理解该请求。
并且您描述的请求是语法有效的JSON(包含在语法有效的HTTP中),因此服务器的请求语法没有问题。
但是 作为评论李Saferite指出,RFC 7231,它淘汰了RFC 2616,不包括限制:
400(错误请求)状态代码表示服务器由于某些原因(例如格式错误的请求语法,无效的请求消息框架或欺骗性的请求路由)而被视为客户端错误,因此服务器无法处理该请求。
但是,在重新措辞之前(或者如果您想现在仅将RFC 7231只是一个提议的标准而争论不休),对于您的用例来说,422 Unprocessable Entity
似乎并不是一个不正确的 HTTP状态代码,因为RFC 4918的介绍说:
虽然HTTP / 1.1提供的状态代码足以描述WebDAV方法遇到的大多数错误情况,但有些错误并没有很好地归类到现有类别中。该规范定义了为WebDAV方法开发的额外状态代码(第11节)
并且描述为422
:
422(不可处理实体)状态代码表示服务器理解请求实体的内容类型(因此415(不支持的媒体类型)状态代码不合适),并且请求实体的语法正确(因此400(错误请求) )状态代码不合适),但无法处理其中的说明。
(请注意对语法的引用;我怀疑7321也部分淘汰了4918)
这声音正是像您的情况,但万一有任何疑问,接着说:
例如,如果XML请求主体包含格式正确(即,语法正确)但语义错误的XML指令,则可能发生此错误情况。
(用“ JSON”替换“ XML”,我想我们可以同意这是您的情况)
现在,有人会反对RFC 4918关于“ Web分布式创作和版本控制(WebDAV)的HTTP扩展”,而您(大概)没有做任何涉及WebDAV的事情,因此不应使用其中的内容。
可以选择在原始标准中使用错误代码(该代码未明确涵盖该情况)与从扩展中准确描述该情况的错误之间进行选择,我将选择后者。
此外,RFC 4918第21.4节引用了IANA超文本传输协议(HTTP)状态代码注册表,可以在其中找到422。
我建议HTTP客户端或服务器使用该注册表中的任何状态代码是完全合理的,只要它们正确地使用了它们即可。
但是从HTTP / 1.1开始,RFC 7231具有吸引力,因此只需使用即可400 Bad Request
!