代码之家  ›  专栏  ›  技术社区  ›  Richard Levasseur

“成功但有错误”的http状态代码?

  •  8
  • Richard Levasseur  · 技术社区  · 14 年前

    我翻了一下,但是我没有看到请求成功时的http状态代码,但是在“point of no return”后面有一个错误。

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

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

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

    3 回复  |  直到 14 年前
        1
  •  4
  •   Sripathi Krishnan    14 年前

    http没有这样的状态代码,但是有一个最佳实践允许您处理这样的情况-在post操作之后重定向用户。

    这里有一个故障-

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

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

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

        2
  •  3
  •   Daniel Vassallo    14 年前

    如果服务器知道它遇到了问题,它通常应该返回5xx错误。最普通的是 500 Server Error ,其中 RFC 2616 定义如下:

    500内部服务器错误

    服务器遇到意外情况,无法运行 从满足要求开始。

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

        3
  •  1
  •   Jim Ferrans    14 年前

    我同意@daniel的说法,正确的响应是http 500(服务器错误)。必须编写web应用程序,以便在出现错误时回滚事务,而不是让事情半途而废。

    在web应用程序中可以利用的一件事是“等幂性”。这是一个函数(或操作)的属性,您可以在相同的结果中任意重复它多次。例如,如果读取失败,客户端可以简单地重试,直到成功为止。如果删除失败,则无论要删除的资源是否已消失,客户端都可以再次重试,服务器都会将该请求视为有效。如果更新失败,客户端可以重试,直到从服务器获得成功的返回。构建web服务的rest方法充分利用了幂等性,使操作在错误面前更加健壮。