当前位置: 首页 > 知识库问答 >
问题:

Http响应207多状态是否适用于多任务操作?

阎经武
2023-03-14

我发现Http 207可以用于批量插入/删除/。。。等等。从业务角度来看,我们可能会插入多个项目,并且部分成功。

我想知道如果我们有API Post调用一些外部服务,是否同样适用?

业务场景示例:

我们有正在创建订单的HttpPost终结点。

HttpPost:
/api/order/

现在我们假设,除了创建订单之外,这个endpoint还将调用外部服务来打印该订单的标签,另一个endpoint将通过REST向外部第三方系统发送某种确认。

现在,在这个场景中,我们假设创建订单是成功执行此操作的必要条件,但是打印和外部REST调用都可以返回错误消息。这可能超出了我们的控制范围。

从我所读到的内容来看,如何返回这些信息的选项是:

  1. 带有某种包含必要信息的对象的Http 200。例如:{"isSucess": true,"isFailure": true,"erorMesage":"string"}
  2. 使endpoint更加RESTful,并将其分为3个将被调用的操作,但在这种情况下,这是不适用的(至少从我的角度来看),因为从业务角度来看,所有这些东西都是紧密耦合的,它们应该绑定在一起
  3. 返回5xx错误。502,因为不是所有的操作都成功了,并且有一些内部问题,但是如果一个失败的操作是502,另一个是503呢
  4. 返回207个错误,每个操作都有正确的错误响应(订单创建: 200,打印: 502,外部第三方: 502)

现在我想知道哪个最合适?我倾向于502错误或207错误,因为在我看来,它们提供了有关系统实际状态的最多信息。

共有1个答案

何建中
2023-03-14

这是一个如何将REST web服务用于嵌套分布式事务的设计问题。有很多合适的答案。以下是我对这一点的看法,我在提到其余规范的同时,阐述了你们的每一点。

  1. HTTP代码207不是一个好主意——这个返回代码(207)是为支持WebDAV的系统指定的(https://en.wikipedia.org/wiki/WebDAV)HTTP上的扩展。WebDAV是分布式的,但它是一个

允许用户代理直接在HTTP web服务器中协作编写内容

WebDAV并不完全是为分布式事务构建的。能够处理返回代码207的服务器需要在其中安装WebDAV模块。您甚至可能无法在多个REST库中获得对该返回代码的支持。例如,这个API文档没有代码207.https://docs.oracle.com/javaee/7/api/javax/ws/rs/core/Response.Status.html(这是一个边缘案例,但它有助于说明这一点)。

以数字“5”开头的响应状态代码表示服务器意识到自己出错或无法执行请求的情况

这里的服务器没有问题。它创建了实体。

HTTP状态202(已接受){“订单”:{“id”:“1234567”}

客户应使用GET/api/order/检查完整状态,这将返回个人状态:

{“id”:1234567,“标签打印”:“失败”,“第三方更新”:“成功”}

如果订单的任何子事务都失败了,应该重新处理,这是对现有订单的更新,也是对PUT /api/order/的调用,因为PUT方法是更新资源。服务器将接受PUT请求,并根据需要重试事务。

以下是一些适用于这个问题的补充答案:

静止交易?

跨REST微服务的事务?

 类似资料:
  • 我知道有人正在编写一个API,并希望使用HTTP状态代码来报告查询的结果。例如,如果用户调用,并且产品不存在,它将返回HTTP状态。我认为,因为这是一个有效的调用(即实际的HTTP请求没有格式错误),它应该返回一个code响应,并且只需要响应的主体类似于。 所以我的问题是,, 1) 使用HTTP状态码来传递非HTTP程序状态是否合适,如上面的示例所示? 2)是否有一些标准规范,或者至少是广泛使用的

  • 我们在Kubernetes中运行Spring Boot服务。 此服务具有终结点: -GET/healthz 我们有活性探测器使用了这个endpoint。探测成功运行。 这意味着可以从service pod(localhost)访问endpoint。 而且马上 当我尝试(不存在的endpoint)时,我得到的仍然是400,而不是404! 当我尝试(错误的主机)时,我得到一个错误。这意味着主机'myh

  • 让我们假设有一个HTTP POST,它接受JSON和一些数据作为输入,并且它必须验证这些数据。该方法还应在响应正文中返回验证消息。 前任。 假设在JSON上定义了一些验证规则,例如(ab)应该小于C参数。 我对HTTP状态代码有一些疑问。 如果JSON是有效的HTTP POST应该返回200 如果JSON无效(缺少参数或错误类型),HTTP POST应该返回400 但是如果JSON是有效的(有所有

  • 我试图创建一个regex来捕获HTTP状态代码和curl请求的主体。下面的regex模式可以在多个在线站点上工作,但在我的Mac命令行上的shell if-语句中不匹配。是我的regex关闭了还是有其他事情发生? 我也对其他方法持开放态度(我的目标是运行Centos5的机器)。

  • 我希望返回http状态代码和响应对象。如果我只是在失败场景中返回response object,则状态返回为200。但是我希望将服务返回的状态(例如:403)与响应对象一起发送。但是下面的代码只是返回消息和状态。在这种情况下,我想要响应对象orderdetails对象,它有失败原因和其他字段。如何将对象传递回客户端有什么帮助吗?

  • 我使用curl获取http头以查找http状态代码并返回响应。我使用以下命令获取http头