我发现Http 207可以用于批量插入/删除等操作,在这些操作中,我们可能要插入多个项目,从业务Angular 来看,部分成功是可以的。
我想知道如果我们有API Post调用一些外部服务,同样的事情是否适用?
示例业务场景:
我们有一个正在创建订单的HttpPost端点。
HttpPost:
/api/order/
现在,我们假设该端点除了创建订单外,还将调用外部服务来打印该订单的标签,并调用另一个服务来通过REST向外部第三方系统发送某种确认。
现在在这个场景中,我们假设创建Order是这个操作成功的必要条件,但是打印和外部REST调用都可能返回错误消息。这可能超出我们的控制范围。
现在,根据我所读到的内容,有关如何返回此信息的选项将是:
- Http 200与包含必要信息的某种对象进行交互。例如:
{ "isSucess": true, "isFailure": true, "erorMesage": "string" }
1.使端点更具有REST风格,并将其分为3个将被调用的操作,但在本例中,这是不适用的(至少从我的Angular 来看),因为从业务Angular 来看,所有这些东西都是紧密耦合的,它们应该绑定在一起
1.返回5xx错误。502,因为不是所有的操作都成功了,并且存在一些内部问题,但是如果一个失败的操作是502,另一个是503,该怎么办
1.返回207错误,并为每个操作提供正确的错误响应(订单创建:200,打印:502,外部第三方:502页)
现在我想知道哪一个是最合适的?我有点倾向于502错误或207,因为在我看来,它们提供了关于系统实际状态的最多信息。
1条答案
按热度按时间7cwmlq891#
这是一个关于如何将REST Web服务用于嵌套分布式事务的设计问题。有很多合适的答案。下面是我对这个问题的看法,我在参考REST规范的同时解决了你的每一个观点。
允许用户代理直接在HTTP Web服务器中协作创作内容
WebDAV并不完全是为分布式事务构建的。能够处理返回代码207的服务器需要在其中安装WebDAV模块。你甚至可能在一些REST库中没有得到对这个返回代码的支持。例如,这个API文档没有代码207. https://docs.oracle.com/javaee/7/api/javax/ws/rs/core/Response.Status.html(这是一个边缘情况,但它有助于说明这一点)。
1.我不喜欢使用HTTP 50 x,如果请求是部分完成的。让我们来看看服务器创建了订单,但无法将其发布到第三方REST服务器的情况(可能是服务器停机或网络错误)。下面是50 x错误https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html的规范:
以数字“5”开头得响应状态代码表示服务器知道它出错或无法执行请求得情况.
服务器在这里没有错。它已经创建了实体。
1.我的建议是在
POST /api/order/
上返回HTTP cod 202,返回对订单的引用并异步处理这些步骤。这个请求涉及多个事务-打印标签、更新第三方REST端点等。这些事务可以在“order”资源中更新。例如,POST /api/order/
可以按以下格式返回:HTTP状态202(已接受){“订单”:{“编号”:“1234567”} }
客户端应使用
GET /api/order/
检查完整状态,它将返回单个状态:{【编号】:1234567,【标签_打印】:“失败”、“第三方更新”:“成功”}
如果一个订单的任何子事务失败了,需要重新处理,这是对现有订单的更新,并且调用
PUT /api/order/
,因为PUT方法是更新资源的。服务器将接受PUT请求,并根据需要重试事务。以下是一些适合此问题的其他答案:
Transactions in REST?
Transactions across REST microservices?