【问题标题】:REST - When to use 400 ("Bad Request")REST - 何时使用 400(“错误请求”)
【发布时间】:2012-06-01 08:52:51
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    来自Wikipedia's List of HTTP Status Codes

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

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

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

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

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

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

    来自维基百科:

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

    另外,这里有一些definitions to assist in the interpretation of status code 422

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

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

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

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

    【讨论】:

    • 我发现这很有用,但我对结论有点困惑。我了解“语义”的计算机科学定义与其一般用途不同。在计算机科学之外,在这种情况下,无效的邮政编码确实可以称为语义错误。我怀疑你是正确的,RFC 专门在计算机科学意义上表示它,但是这样的错误有多大用处呢?事实上,那怎么可能是 client 错误呢?
    • 我无法理解 422 状态。如果邮政编码 123456 无效,这是语义(逻辑)错误,不是吗?这样我们就应该使用422状态。
    • @surfrider - 澄清的是“语义”定义的最后一句话。当他们说语义错误时,他们指的是不正确的变量大小或类型、不存在的变量、超出范围的下标等。无效的邮政编码似乎是数据问题,而不是数据类型或数据大小问题,数组下标超出范围,等等……
    • 其实我能想到一个例子。如果您已将数据类型的大小设置为仅占用 5 位数字并且您将其设为 6,那么我认为您可以提出使用状态码 422 的理由,但我认为这只是超出数据类型长度的副作用,而不是因为实际数据无效。我仍然可以提供一个不超过任何变量限制的无效 5 位邮政编码,在这种情况下,我认为我们不能证明状态代码 422 是合理的。希望这会有所帮助。
    • @tonix 在这种情况下,我认为您应该返回 405 - Method Not Allowed
    【解决方案2】:

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

    7.4.1。 400 错误请求

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

    【讨论】:

    • 400 代码是否还包括用户不是资源所有者的有效负载中的 id?
    • @Elisabeth 不确定我是否完全理解您的情况,但我认为答案是肯定的。
    • 该场景是一个负载,其中包含一些属于另一个用户的外键 ID。删除服务器上的这些 id 将删除另一个用户的资源。那真的很糟糕。
    • @Elisabeth 那么是的,我认为 400 适合告诉用户提交的请求不是合理的请求。在您的场景中,由于相关资源属于另一个所有者,因此 403 Forbidden 可能是更精确的状态代码。
    • @Elisabeth 我想我会在你的情况下使用 403,因为它更具体——要求删除这些资源可能是客户端错误,但这是一个错误,因为它是被禁止的。这将提供更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 2011-09-29
    相关资源
    最近更新 更多