在您提问时(以及我的原始答案),RFC 7231还不存在;那时我反对使用400 Bad Request
,因为RFC 2616说(强调是我的):
由于语法错误,服务器无法理解请求。
而您描述的请求是语法上有效的JSON封装在语法上有效的HTTP中,因此服务器没有关于请求的语法问题。
现在看来,400 Bad Request似乎是您的用例中最好的HTTP/1.1状态码。
然而,正如Lee Saferite在评论中指出的那样, RFC 7231,取代了RFC 2616,没有包括该限制:
400(错误请求)状态代码表示服务器由于认为是客户端错误(例如,格式错误的请求语法,无效的请求消息框架或欺骗性请求路由)而无法或不会处理请求。
然而,在重新表述之前(或者如果你想挑剔的话,RFC 7231现在只是一个提议标准),对于你的使用情况,422 Unprocessable Entity
似乎不是一个错误的HTTP状态码,因为正如RFC 4918的介绍所说:
虽然HTTP/1.1提供的状态码足以描述WebDAV方法遇到的大多数错误条件,但有些错误并不很容易归入现有的类别。本规范定义了为WebDAV方法开发的额外状态码(第11节)
而关于422
的描述则说:
422(无法处理的实体)状态码表示服务器理解请求实体的内容类型(因此不适用415(不支持的媒体类型)状态码),并且请求实体的语法正确(因此不适用400(错误请求)状态码),但无法处理所包含的指令。(请注意语法的参考;我怀疑7231在某种程度上也使4918过时了)
这听起来与您的情况
完全相同,但为防万一,它继续说:
例如,如果XML请求正文包含格式良好(即语法正确),但语义上错误的XML指令,则可能会出现此错误条件。
(将“XML”替换为“JSON”,我认为我们可以认为这是您的情况)
现在,有些人会反对RFC 4918是关于“Web分布式创作和版本控制的HTTP扩展(WebDAV)”,而您(可能)没有涉及WebDAV,因此不应使用其中的东西。
若在原标准中使用明确无法涵盖该情况的错误代码和从扩展中获取并描述该情况的错误代码之间进行选择,我会选择后者。
此外,RFC 4918第21.4节提到了IANA超文本传输协议(HTTP)状态码注册表,其中可以找到422。
我建议HTTP客户端或服务器完全可以在正确使用的前提下使用该注册表中的任何状态码。
但是从HTTP/1.1开始,
RFC 7231已经得到了广泛应用,所以只需使用
400 Bad Request
即可!