【问题标题】:HTTP status code for "success with errors"?“成功但有错误”的 HTTP 状态代码?
【发布时间】:2010-06-18 03:06:14
【问题描述】:

我查了一下,但我没有看到请求成功时的 HTTP 状态代码,但在“不返回点”之后出现错误。

例如,假设您处理了一个请求,它已提交给数据库,但是在返回结果时您会运行内存,或者遇到 NPE,或者您有什么。它200 响应,但现在,在内部,您无法返回正确、格式正确的响应。

202 Accepted 似乎不合适,因为我们已经处理了请求。

什么状态码表示“成功,但有错误”?真的存在吗?

【问题讨论】:

  • 在这种情况下,您必须确保您还没有向客户端发送一些数据,因为那时您已经过了不归路:在数据的第一个字节之前,标头(包括状态码)被发送到浏览器。
  • 嘿-授予:)。我想我说的是那个不归路点之前的不归路点。但是,大多数时候,服务器端代码会在发送之前在内存中构建完整的响应,因为它们通常足够小。

标签: http rest http-status-codes


【解决方案1】:

HTTP 没有这样的状态码,但是有一个最佳实践可以让您处理这种情况 - 在 POST 操作后重定向用户。

这是一个细分 -

  1. POST 请求尝试修改服务器上的数据
  2. 如果服务器发生故障,它会发送一个 500 错误来指示故障
  3. 如果服务器成功,则发送 302 重定向响应
  4. 然后浏览器向服务器发送一个新的 GET 请求
  5. 如果失败,您会收到 500 错误,否则您会收到 200

因此,您的“已保存数据但无法立即检索它”的用例转换为初始 POST 的 302 重定向,然后是后续 GET 的 500。

这种方法还有其他优点 - 您可以摆脱烦人的“您确定要重新提交数据吗?”信息。还可以保持您的后退/前进/刷新按钮可用。

【讨论】:

    【解决方案2】:

    如果服务器知道它遇到了问题,它通常应该返回一个 5xx 错误。最通用的是500 Server ErrorRFC 2616 定义如下:

    500 内部服务器错误

    服务器遇到了阻止它的意外情况 完成请求。

    然后,客户有责任重新尝试请求。如果先前的请求被部分提交,则服务器(或数据库)有责任回滚该请求,或适当地处理重复的事务。

    【讨论】:

    • 我对这个答案不太满意。 “履行”究竟是什么意思?我们以客户要求的任何方式修改了资源。如果他们重新加载页面,他们会看到更改。就用户而言,它是成功的。对我来说,听起来我们确实完成了 request,但还没有完成 response
    • @Richard:我一直理解“履行”也包括响应(但我可能错了)。然而,这个状态码是非常通用的,它应该在服务器遇到无法用另一个更具体的 5xx 错误描述的问题时使用。我认为@Jim 描述了我想说的更好,in the other answer
    【解决方案3】:

    我同意@Daniel 的观点,正确的响应是 HTTP 500(服务器错误)。必须编写 Web 应用程序以在出现错误时回滚事务,而不是半途而废。

    您可以在 Web 应用程序中利用的一件事是“幂等性”。这是一个函数(或操作)的属性,您可以根据需要重复多次并获得相同的结果。例如,如果读取失败,客户端可以简单地重试,直到成功。如果删除失败,客户端可以再次重试,无论被删除的资源是否已经消失,服务器都会将请求视为有效。如果更新失败,客户端可以重试,直到从服务器成功返回。用于构建 Web 服务的 REST 方法大量使用幂等性来使操作在面对错误时更加稳健。

    【讨论】:

    • 为了澄清,事务已经提交(例如,考虑在响应编码期间发生 OutOfMemoryError 的情况)。要实现幂等性,您需要实现版本控制,不是吗?让服务器跟踪提交的更改,客户端提供和更改 id。还有处理非临时错误的情况(比如有一个错误导致 NPE 而不是内存不足错误) - 客户端可以重试他们想要的所有内容,但它永远不会成功(尽管它已经成功第一次,后面的时间是多余的)。
    • @Richard:这“完全取决于”。如果它是一个内容管理应用程序,并且您不介意两个“同时”更新似乎偶尔会出现不严格的顺序,那么您不必进行版本控制。但是,如果您有更严格的限制,版本控制或时间戳可能是合适的。另一种方法是在事务范围内尽可能多地形成响应,因此 OOME 会导致事务中止。也许保存事务请求和结果的持久消息队列可能是您想要的(查看 Apache 的 ActiveMQ)。 +1 探索性问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2016-06-12
    • 1970-01-01
    相关资源
    最近更新 更多