HTTP 400(错误请求)用于逻辑错误,而不是格式错误的请求语法

Ati*_*ziz 63 http http-status-codes http-status-code-400

HTTP/1.1规范(RFC 2616)具有以下对的意义上说的状态代码400,错误的请求(§10.4.1) :

由于语法格式错误,服务器无法理解请求.客户端不应该在没有修改的情况下重复请求.

现在,在一些基于HTTP的API中似乎存在一种普遍的做法,即使用400来表示请求的逻辑错误而不是语法错误.我的猜测是API这样做是为了区分400(客户端引发)和500(服务器引发).使用400表示非语法错误是否可接受或不正确?如果可以接受,RFC 2616上是否有注释参考,可以更深入地了解400的预期用途?

例子:

Jul*_*hke 62

我想到状态422(RFC 4918,第11.2节):

422(不可处理实体)状态代码表示服务器理解请求实体的内容类型(因此415(不支持的媒体类型)状态代码是不合适的),并且请求实体的语法是正确的(因此400(错误请求) )状态代码不合适)但无法处理包含的指令.例如,如果XML请求主体包含格式正确(即语法正确)但语义错误的XML指令,则可能发生此错误情况.

  • 422非常接近.唯一的耻辱是它似乎特别关注一个不可处理的实体而不是一个不可处理的请求.如果它只包含后者,那么它也将涵盖HTTP GET的情况,因为它没有实体.然而,422的描述确实清楚地表明400不适合于逻辑上无效的请求. (5认同)
  • 是的,没关系.这就是为什么有一个状态代码注册表.请参阅http://www.iana.org/assignments/http-status-codes. (3认同)

Jon*_*Jon 17

截至目前,HTTPbis规范的最新草案(旨在取代并使RFC 2616过时)表明:

400(错误请求)状态代码表示服务器不能或不会处理请求,因为收到的语法无效,无意义或超出服务器愿意处理的某些限制.

这个定义虽然当然仍有可能改变,但批准了用400响应逻辑错误的广泛使用的做法.


And*_*lau 6

HTTPbis将解决400 Bad Request的措辞,以便它也涵盖逻辑错误.所以400将合并422.

来自https://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-18#section-7.4.1
"由于客户端错误(例如,格式错误,服务器无法或不会处理请求)句法)"