10

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

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

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

什么状态码表示“成功,但有错误”?一个甚至存在吗?

4

3 回答 3

4

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

这是一个细分 -

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

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

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

于 2010-06-18T05:40:02.660 回答
3

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

500内部服务器错误

服务器遇到了一个意外情况,导致它无法完成请求。

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

于 2010-06-18T03:14:36.133 回答
1

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

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

于 2010-06-18T03:45:02.920 回答