外部API关闭时REST API状态-最佳实践

外部API关闭时REST API状态-最佳实践,rest,web-services,http,Rest,Web Services,Http,我正在寻找有关从RESTAPI返回错误的良好实践的指导。我正在开发一个新的API,所以我可以向任何方向发展 在我的例子中,客户端调用我的API,该API在内部调用一些外部API。如果成功,没有问题,但是如果远端(外部云API)出现错误响应,我不确定这类服务的行业标准是什么。我目前正在考虑返回200 OK,然后返回一个json负载,其中详细说明了外部API错误 那么,行业建议是什么?良好实践(请解释原因!)以及,从客户机的角度来看,REST API中的何种错误处理方式使客户机代码的使用更加方便?您

我正在寻找有关从RESTAPI返回错误的良好实践的指导。我正在开发一个新的API,所以我可以向任何方向发展

在我的例子中,客户端调用我的API,该API在内部调用一些外部API。如果成功,没有问题,但是如果远端(外部云API)出现错误响应,我不确定这类服务的行业标准是什么。我目前正在考虑返回200 OK,然后返回一个json负载,其中详细说明了外部API错误


那么,行业建议是什么?良好实践(请解释原因!)以及,从客户机的角度来看,REST API中的何种错误处理方式使客户机代码的使用更加方便?

您所问的故障是在服务本身的内部发生的,尽管它具有外部依赖性,因此5XX状态代码范围是正确的选择。503服务不可用看起来非常适合您描述的情况

5XX代码用于告诉客户端,即使请求很好,服务器在满足请求时也出现了某种问题。另一方面,

4XX代码用于告诉客户端它在请求中做了一些错误的事情(并且服务器很好,谢谢)。
解释4XX和5XX代码的不同用途。

您所询问的故障是发生在服务本身内部的故障,尽管它具有外部依赖性,因此状态代码范围是正确的选择。503服务不可用看起来非常适合您描述的情况

5XX代码用于告诉客户端,即使请求很好,服务器在满足请求时也出现了某种问题。另一方面,

4XX代码用于告诉客户端它在请求中做了一些错误的事情(并且服务器很好,谢谢)。
解释4XX和5XX代码的不同用途。

我们的同事已经提供了有关HTTP状态代码的链接/解释,因此您应该了解它们并找到最适合您的代码

假设你已经学会了状态码,我会更专注于什么会影响你的决定

基本上,您应该了解当客户机调用“您的”API时触发的流的业务含义。客户机对您正在使用的外部云API一无所知,也不关心它是否工作,客户机与您的应用程序一起工作

如果是这样的话,当远程系统返回某种错误时(是的,不同的错误状态应该会让您知道远程系统出了什么问题),如何处理此错误是您的业务决策,根据此决策,您可能希望在与客户机的交互中“表现”不同

以下是一些例子:

  • 您知道,远程系统很少发生故障。但一旦不可用,您的系统就无法正常工作。 在这种情况下,如果失败,您可能会考虑重试调用远程系统。如果您仍然运气不佳,则返回一些错误状态。可能是5XX

  • 您知道远程客户机提供的数据并不重要,另一方面,当客户机调用您的API时,最好提供“某些东西”,即使它不是真正最新的,也比什么都不重要。考虑一下远程系统,它通过一些客户端id提供“推荐电影”。您正在构建一个门户(netflix风格)。如果这个推荐的电影服务由于某种原因关闭了,那么让整个门户页面失败是没有意义的(想想糟糕的用户体验)。在这种情况下,您可能希望“预缓存”一些通用的电影列表,并在远程服务出现故障时将其用作备用方案。在这种情况下,显然在任何情况下都应该返回2XX状态

  • 更先进的架构。您知道远程服务经常失败,当它关闭时,您可以继续工作。在这种情况下,您可能希望选择与客户机交互的“异步”样式。例如:客户机呼叫您的rest,您立即以“已接受”状态代码(202)作出响应。您可以将此id与状态一起保存在某些数据库中,以便当用户“按票证id请求票证状态”时,您可以查询数据库。关键是你要马上回来。然后,您可能希望将带有任务的消息发送到某个消息传递系统,一旦消费者选择该消息,就会对其进行处理并更新数据库。只要远程服务失败,消息就会返回到仍处于“未处理”状态的队列(通常消息传递系统可以实现此行为)。现在,在某个时间点,远程系统开始响应,所有消息都得到处理。现在,它们在DB中的状态为“完成”。 所以,这取决于客户机询问“发生了什么事”/或者您可以使用web套接字或其他东西实现一些推送模型(在本例中不再是REST风格的通信)。但关键是,在某个时间点,客户机将收到“好的,我们完成了票据ID”(状态200)。在这种情况下,客户机可以调用一个特殊的端点,并使用存储在数据库中的结果(同样是状态200)


  • 总之,正如您所看到的,HTTP返回码只是一个指示符,但是,如何组织与客户端的互连过程取决于您,相关的HTTP状态将从您的决定中衍生出来。

    我们的同事已经提供了有关HTTP状态代码的链接/解释,因此您应该了解它们并找到最适合您的情况的链接/解释

    假设你已经学会了状态码,我会更专注于什么会影响你的决定

    基本上,你应该了解什么是业务含义
    {
        "error_code": 1234,
        "description": "X happened with Y because of Z.",
        "learn_more": "https://dev.my.app/errors/1234",
        "id": "90daa63b-f5ac-4c33-97d5-0801ade75a5d"
    }