外部依赖出错,HTTP状态码为424或500。

104

我正在尝试创建一个有两个依赖项的服务。其中一个依赖项是内部管理的,而第二个需要对第三方API进行外部http调用。该序列要求更新资源,然后执行http外部调用。

所以我的问题是,在第二步失败的情况下,应该返回什么正确的http状态码?

响应应该是424还是500,并附带一个解释遇到错误的消息体?

  • 424:方法失败 - 表示由于某些方法执行失败导致整个方法被中止,因此未在其范围内的特定资源上执行该方法。
  • 500:内部服务器错误。

更新: 请注意,在这种特定的用例中,使用我的服务的客户端不一定知道/需要知道我公开的服务部分依赖于在第二步期间失败的外部API。

3个回答

104

你所询问的故障发生在服务内部,因此5xx状态码范围是正确的选择。503服务不可用看起来非常适合你所描述的情况。

5xx代码用于告诉客户端,即使请求是正确的,服务器也遇到了某种问题无法满足请求。另一方面,4xx代码用于告诉客户端它做错了什么(而服务器没问题,谢谢)。HTTP 1.1规范的第10.4和10.5节解释了4xx和5xx代码的不同目的。

状态码424定义在WebDAV标准中,用于客户端需要更改其操作的情况 - 服务器在这里没有任何问题。


8
我认为HTTP错误代码502或504应该是正确的,正如@mustafaturan在下一个评论中提到的那样。这里是外部依赖未响应。因此,当前服务器不必因无法提供服务而被标记为故障。如果我说错了,请纠正我。 - mwKART
同意观点:如果是依赖超时问题,则返回504;如果是其他依赖问题,则返回502,但不是503,因为503表示服务器本身的“临时”或“维护”状态,而不是依赖问题。 - Michael S

56

由于第二个操作是外部服务调用,根据情况选择502或504。

引自:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.3

10.5.3 502 Bad Gateway

服务器作为网关或代理时,在尝试满足请求时从上游服务器接收到无效响应。

10.5.4 503 Service Unavailable

服务器当前无法处理请求,因为服务器临时超载或正在维护。意味着这是一个暂时的条件,将在一定延迟后得到缓解。如果已知,则可以在Retry-After头中指示延迟的长度。 如果未给出Retry-After,则客户端应该处理响应,就像处理500响应一样。

  Note: The existence of the 503 status code does not imply that a
  server must use it when becoming overloaded. Some servers may wish
  to simply refuse the connection.

10.5.5 504 网关超时

服务器在充当网关或代理时,未能及时从URI指定的上游服务器(例如HTTP,FTP,LDAP)或其他必要访问的辅助服务器(例如DNS)接收到响应,以尝试完成请求。

  Note: Note to implementors: some deployed proxies are known to
  return 400 or 500 when DNS lookups time out.

17

如果服务端预计问题可以缓解(例如从上游服务器获得503),则使用503 Service Unavailable。如果来自上游服务器的错误未知且不知道如何响应,则应使用502 Bad Gateway。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接