我已经浏览了一下,但是我没有看到请求成功时的 HTTP 状态代码,但是在“不返回点”之后出现错误。
例如,假设您处理一个请求,它已提交给数据库,但在返回结果时您运行内存,或者遇到 NPE,或者您有什么。这本来是一个200
响应,但现在,在内部,您无法返回正确的、格式良好的响应。
202 Accepted
似乎不合适,因为我们已经处理了请求。
什么状态码表示“成功,但有错误”?一个甚至存在吗?
我已经浏览了一下,但是我没有看到请求成功时的 HTTP 状态代码,但是在“不返回点”之后出现错误。
例如,假设您处理一个请求,它已提交给数据库,但在返回结果时您运行内存,或者遇到 NPE,或者您有什么。这本来是一个200
响应,但现在,在内部,您无法返回正确的、格式良好的响应。
202 Accepted
似乎不合适,因为我们已经处理了请求。
什么状态码表示“成功,但有错误”?一个甚至存在吗?
HTTP 没有这样的状态代码,但是有一个最佳实践可以让您处理这种情况 - 在 POST 操作后重定向用户。
这是一个细分 -
因此,您的“已保存数据但无法立即检索”的用例将转换为初始 POST 的 302 重定向,然后是后续 GET 的 500。
这种方法还有其他优点 - 您摆脱了烦人的“您确定要重新提交数据吗?” 信息。还可以保持您的后退/前进/刷新按钮可用。
如果服务器知道它遇到了问题,它通常应该返回一个 5xx 错误。最通用的是500 Server Error
RFC 2616定义如下:
500内部服务器错误
服务器遇到了一个意外情况,导致它无法完成请求。
然后,客户有责任重新尝试请求。如果先前的请求被部分提交,则服务器(或数据库)有责任回滚该请求,或适当地处理重复事务。
我同意@Daniel 的正确响应是 HTTP 500(服务器错误)。必须编写 Web 应用程序以在出现错误时回滚事务,而不是半途而废。
您可以在 Web 应用程序中利用的一件事是“幂等性”。这是一个函数(或操作)的属性,您可以根据需要重复多次并获得相同的结果。例如,如果读取失败,客户端可以简单地重试,直到成功。如果删除失败,客户端可以再次重试,无论被删除的资源是否已经消失,服务器都会将请求视为有效。如果更新失败,客户端可以重试,直到从服务器成功返回。用于构建 Web 服务的 REST 方法大量使用幂等性来使操作在面对错误时更加稳健。