【问题标题】:REST API & HTTP Status CodeREST API & HTTP 状态码
【发布时间】:2015-03-26 14:24:00
【问题描述】:

我有一堆对输入资源执行操作的 PUT 操作。 让我们举个例子:我的 API 中有一个支付操作,它声明信用卡必须按特定金额收费。 在我的代码中,我首先验证卡上是否有足够的信用,然后执行操作。如果没有足够的金额,我只是返回 400,但我不确定它是否正确。

在这种情况下哪个是正确的 HTTP 状态代码?

当然,我可以使用HTTP 200 发送响应,并附加一个有效负载,其中包含解释错误的更多详细信息。我也可以发回HTTP 400 Bad Request,或者更好的是HTTP 412 Precondition Failed。

在这种验证失败的情况下,在响应中发送的正确代码是什么?是否有任何资源可供我阅读以了解 HTTP 状态代码和 HTTP 动词背后的基本原理?

【问题讨论】:

    标签: rest asp.net-web-api asp.net-web-api2 http-status-codes


    【解决方案1】:

    使用 422 无法处理的实体。

    422 状态码表示服务器理解请求实体的内容类型(因此 415 Unsupported Media Type 状态码是不合适的),并且请求实体的语法是正确的(因此 400 Bad Request 状态码是不合适的) 但无法处理包含的说明。

    如果做不到这一点,只需使用 400 来处理与您的业务域有关的任何错误。自 2004 年 6 月起,错误 400 的描述被修改为:

    由于被认为是客户端错误,服务器无法或不会处理请求

    【讨论】:

    • 感谢您的回答。但是,虽然您的回答对我来说很有意义,但我不能简单地在 System.Net.HttpStatusCode 枚举中找到对应的枚举值。事实上,这个枚举从 417 跳到了 426。正确吗?
    • 提供有意义的有效负载(并记录发生错误时发生的情况)比使用“正确”的 HTTP 错误代码更重要。另请参阅stackoverflow.com/a/3290198/102937,它表示错误 400 的描述自 2004 年 6 月起已更改,使其更适合您的错误情况。
    【解决方案2】:

    如果由于用户发送的数据导致操作失败(似乎是这种情况),您应该使用状态代码400(通用)或422(更精确,但来自 WebDAV 规范)。您可以返回有关负载中错误的其他提示(结构取决于您),例如:

    {
        error: {
           "field": "amount",
           "message": "The amount isn't correct - Sufficient credit."
        }
    }
    

    我认为代码412 在这里不适用,因为它必须在您的服务器不满足客户端指定的条件时返回(参见标题If-*,如If-Match、If-Modified-Since、.. .).

    希望对你有帮助 蒂埃里

    【讨论】:

      【解决方案3】:

      IMO:我会坚持使用 200,然后解析出响应并处理它。 HTTP 状态码是协议状态码,不应该用于处理应用程序逻辑。

      {
          "error": {
             "field": "amount",
             "message": "The amount isn't correct - Sufficient credit."
          }
      }
      

      在上述代码的情况下,服务调用运行良好,保证返回代码 200。但是,您的应用程序逻辑现在需要处理报告的错误。

      如果我们使用 HTTP 状态代码来指示错误,即使没有技术错误,我们也会开始在日志等中被标记。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-15
        • 1970-01-01
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 2021-04-20
        • 2014-06-22
        • 1970-01-01
        相关资源
        最近更新 更多