30

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

4

2 回答 2

35

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

400 Bad Request: 由于语法错误,请求无法完成。

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

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

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

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

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

来自维基百科:

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

此外,这里有一些定义来帮助解释状态码 422

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

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

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

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

于 2012-06-01T08:56:24.683 回答
17

此处找到的 HTTP 规范的修订版更新了措辞,试图避免这种混淆,因为 400 仅限于格式错误的请求。

7.4.1。400 错误请求

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

于 2012-06-01T11:20:18.110 回答