REST - 何时使用400(“错误请求”)

时间:2012-06-01 08:52:51

标签: xml rest http-status-codes restful-architecture http-status-code-400

我有像sales / customers / {customerno}这样的资源。如果客户端向此资源发送PUT请求,则如果实体主体中的xml无效,则返回400 - Bad请求。但是,如果xml有效,但xml的内容无效,该怎么办?比如说客户端正在尝试更新客户PostCode并提供无效的PostCode。在这种情况下返回400 - Bad请求是正确的,还是我应该使用的另一个http代码?

2 个答案:

答案 0 :(得分:30)

来自Wikipedia's List of HTTP Status Codes

  

400错误请求   由于语法错误,无法满足请求。

在这种情况下,您的客户端向您发送了一个XML负载,该负载具有无效的邮政编码,这是一种无效的语法形式;因此,在这种情况下,发送400 Bad Request是一个适当的错误代码。

此外,维基百科引用RFC-4918作为该主题的资源。在本文档中,您将找到以下信息:

  

服务器可以拒绝可疑请求(尽管如此)      它们由格式良好的XML组成,例如,400(Bad      请求)状态代码和可选的响应正文解释      问题

由于您的请求格式正确(XML不是很糟糕,只包含语义上不正确的信息),您可能拒绝状态代码为400的内容。单词{{1} }表明还有其他选择。

虽然您可能想要使用状态代码422,但在这种情况下这是不正确的,因为无效的邮政编码不符合语义错误的标准。请阅读以下内容......

来自维基百科:

  

422无法处理的实体(WebDAV; RFC 4918):     该请求格式正确,但由于语义错误而无法遵循。

此外,还有一些definitions to assist in the interpretation of status code 422

  
      
  • 语法错误在解析输入代码期间发生,并且由语法错误的语句引起。典型的错误可能是输入中的非法字符,缺少运算符,连续两个运算符,同一行上的两个语句,没有插入分号,括号不平衡,保留字放错位等等。

  •   
  • 在语法错误被解析为语法正确之后,会在代码执行期间发生语义错误。这些不必与陈述如何构建,而是与它们的含义有关。不正确的变量类型或大小,不存在的变量,超出范围的下标等等都是语义错误。

  •   

您的无效邮政编码既不是语法错误也不是语义错误;因此,排除状态码422作为选项是合理的。

要回答您的问题,状态代码400是合适的;但是,您可能还有其他选择。

答案 1 :(得分:17)

发现的HTTP规范的修订版here更新了措辞,试图避免将400仅限于格式错误的请求的混淆。

  

7.4.1。 400错误请求

     

由于客户端,服务器无法或不会处理请求   错误(例如,语法格式错误)。