Web Services Http响应207 MULTI-STATUS是否适用于多任务操作?

xghobddn  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(156)

我发现Http 207可以用于批量插入/删除等操作,在这些操作中,我们可能要插入多个项目,从业务Angular 来看,部分成功是可以的。
我想知道如果我们有API Post调用一些外部服务,同样的事情是否适用?
示例业务场景:
我们有一个正在创建订单的HttpPost端点。

HttpPost:
/api/order/

现在,我们假设该端点除了创建订单外,还将调用外部服务来打印该订单的标签,并调用另一个服务来通过REST向外部第三方系统发送某种确认。
现在在这个场景中,我们假设创建Order是这个操作成功的必要条件,但是打印和外部REST调用都可能返回错误消息。这可能超出我们的控制范围。
现在,根据我所读到的内容,有关如何返回此信息的选项将是:

  1. 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,因为在我看来,它们提供了关于系统实际状态的最多信息。
7cwmlq89

7cwmlq891#

这是一个关于如何将REST Web服务用于嵌套分布式事务的设计问题。有很多合适的答案。下面是我对这个问题的看法,我在参考REST规范的同时解决了你的每一个观点。

  1. HTTP代码207不是一个好主意-此返回代码(207)是为支持HTTP上的WebDAV(https://en.wikipedia.org/wiki/WebDAV)扩展的系统指定的。WebDAV是分布式的,但它是一个
    允许用户代理直接在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?

相关问题