“成功与错误”的HTTP状态代码?

时间:2010-06-18 03:06:15

标签: http rest http-status-codes

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

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

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

什么状态代码意味着“成功,但错误”?甚至还存在吗?

3 个答案:

答案 0 :(得分:4)

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

这是一个细分 -

  1. POST请求尝试修改服务器上的数据
  2. 如果服务器发生故障,则会发送500错误以指示失败
  3. 如果服务器成功,则会发送302重定向响应
  4. 然后,浏览器向服务器发送新的GET请求
  5. 如果失败,则会收到500错误,否则会收到200
  6. 因此,“保存数据但无法立即检索”的用例转换为初始POST的302重定向,然后是后续GET的500重定向。

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

答案 1 :(得分:3)

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

  

500内部服务器错误

     

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

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

答案 2 :(得分:1)

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

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