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

rgu*_*aug 25 xml rest http-status-codes http-status-code-400 restful-architecture

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

jmo*_*253 31

来自维基百科的HTTP状态代码列表:

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

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

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

服务器可以拒绝可疑请求(即使它们由格式良好的XML组成),例如,400(错误请求)状态代码和解释问题的可选响应主体.

由于您的请求格式正确(XML不错,它只包含语义上不正确的信息),您可以拒绝状态代码为400的内容.这个词*may*表明还有其他选项.

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

来自维基百科:

422 Unprocessable Entity(WebDAV; RFC 4918):请求格式正确,但由于语义错误而无法遵循.

此外,以下是一些有助于解释状态代码422的定义:

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

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

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

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

  • 我发现这很有用,但我对结论感到有些困惑.我知道计算机科学对"语义"的定义与其一般用法不同.在计算机科学之外,在这种情况下,无效的邮政编码确实可以被称为语义错误.我怀疑你是否正确,RFC在计算机科学意义上具体意味着它,但那么这样的错误有多么有用呢?事实上,它怎么可能是*客户*错误呢? (2认同)
  • 我无法理解 422 状态。如果邮政编码 123456 无效,这是语义(逻辑)错误,不是吗?这样我们就应该使用422状态。 (2认同)
  • @surfrider - 澄清了"语义"定义的最后一句话.当他们说语义错误时,他们指的是不正确的变量大小或类型,不存在的变量,超出范围的下标等.无效的邮政编码似乎是数据问题,而不是数据类型或数据大小问题,数组下标超出范围,等等... (2认同)
  • 实际上,有一个我能想到的例子.如果您将数据类型的大小设置为只有5位数并且给它6,那么我认为您可以使用状态代码422,但我认为这只是超出数据类型长度的副作用而不是因为实际数据无效.我仍然可以提供一个无效的5位数邮政编码,不会超过任何变量限制,在这种情况下,我认为我们不能证明状态代码422的合理性.希望这会有所帮助. (2认同)

Dar*_*ler 17

这里发现的HTTP规范的修订版更新了措辞,试图避免将400仅限于畸形请求的混淆.

7.4.1.400错误请求

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