HTTP 400(错误请求)用于逻辑错误,而不是格式错误的请求语法
HTTP / 1.1规范(RFC 2616)对状态码400的含义说明如下: 错误请求(§10.4.1) :
由于格式错误,服务器无法理解请求。 客户端不应该不加修改地重复请求。
目前在几个基于HTTP的API中似乎有一个惯例,使用400来表示请求的逻辑错误而不是语法错误。 我的猜测是,API正在做这个区分400 (客户端诱导)和500 (服务器诱导)。 用400来表示非语法错误是可以接受的还是不正确的? 如果可以接受的话,RFC 2616中是否有注释参考,可以更深入地了解400的预期用途?
例子:
- Google数据协议,协议参考,HTTP状态代码
想到的是422状态( RFC 4918,11.2节 )
422(不可处理的实体)状态码意味着服务器理解请求实体的内容types(因此415(不支持的媒体types)状态码是不合适的),并且请求实体的语法是正确的(因此400 )状态码不合适),但无法处理包含的说明。 例如,如果XML请求主体包含格式正确(即,语法正确),但语义错误的XML指令,则可能会出现此错误情况。
到目前为止,旨在替代和制定RFC 2616的HTTPbis规范的最新草案指出 :
400(错误请求)状态码指示服务器不能或不会处理该请求,因为接收的语法无效,无意义,或者超出了服务器愿意处理的某些限制。
这个定义虽然当然还有待改变,但却批准了广泛使用的对400逻辑错误做出回应的做法。
HTTPbis将解决400错误请求的措辞,以便它也覆盖逻辑错误。 所以400将纳入422。
从https://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-18#section-7.4.1
“服务器不能或不会处理请求,由于客户端错误(例如格式不正确)”
尽pipe如此,我也一直在用400来表示逻辑错误,但我不得不说,在这种情况下返回400是错误的,因为规范读取的方式。 这就是为什么我这样认为,逻辑错误可能是与另一个实体的关系失败或不满意,而对另一个实体的更改可能导致以后同样的确切结果。 就像试图(完全假设的)在该员工不存在时添加员工作为部门成员(逻辑错误)。 将员工添加为成员请求可能会失败,因为员工不存在。 但是,在员工被添加到系统之后,可以传递相同的确切请求。
只是我的2美分…我们需要律师和法官来解释这些天在RFC语言:)
谢谢,Vish
有人可能会认为,即使您在HTTP级别的实际请求(请求行,头文件等)在语法上有效,请求中的数据不正确也是语法错误。
例如,如果Restful Web服务被logging为接受带有自定义XML内容types的application/vnd.example.com.widget+xml
POST,而您发送一些乱码纯文本或二进制文件,似乎不太合适作为一个语法错误 – 你的请求体没有在预期的forms。
我不知道有任何官方的参考文件支持这个,像往常一样,它似乎是解释RFC 2616。
在Java EE服务器上,如果URL指向不存在的“Web应用程序”,则返回400。 这是一个“语法错误”? 取决于你的意思是语法错误。 我会说是的。
在英语语法规则中规定了词类之间的某些关系。 例如,“鲍勃与玛丽结婚”在语法上是正确的,因为它遵循模式{名词+动词+名词}。 而“鲍勃·玛丽婚姻”在语法上不正确,{名词+名词+名词}。
简单的URLis {protocol +:+ // + server +:+ port}的语法。 根据这个“ http://www.google.com:80 ”在语法上是正确的。
但是“abc://www.google.com:80”呢? 它似乎遵循完全相同的模式。 但实际上这是一个语法错误。 为什么? 因为'abc'不是DEFINED协议。
关键是确定我们是否有400的情况需要比parsing字符,空格和分隔符更多的东西。 它还必须认识到什么是有效的“词性”。