gpt4 book ai didi

rest - 如何处理 REST POST 请求中的网络连接丢失?

转载 作者:行者123 更新时间:2023-12-03 07:58:20 25 4
gpt4 key购买 nike

REST POST 用于创建资源。

假设我们有资源 url"http://example.com/cars "

我们想制造一辆新车。我们使用包含汽车属性(颜色、重量、型号等)的 JSON 有效负载发布到“ http://example.com/cars ”。

服务器接收请求,创建新车,通过网络发送响应。

此时网络出现故障(假设路由器停止正常工作并忽略每个数据包)。

客户端因 TCP 超时(如 90 秒)而失败。客户不知道是否创建了汽车。此外,客户端还没有收到汽车资源 ID,因此无法获取它来检查它是否已创建。

现在怎么办?你怎么处理这个?您不能简单地重试创建,因为重试只会创建一个副本(这很糟糕)。

最佳答案

REST POST is used to create resources.

HTTP POST用于很多事情。 REST 并不特别关心;它只需要支持统一界面和超媒体的资源。

At this point network fails

糟糕!

Now what? How do you handle this? You can't simply retry creating, because retrying will just create a duplicate (which is bad).

这是一个普遍的消息传递问题,与 REST 没有直接关系。最常见的解决方案是使用 Idempotent Receiver图案。简而言之,你需要定义您的消息,以便接收者有足够的信息将请求识别为已经完成的事情。

理想情况下,这在 business level 得到支持.

值的幂等集合通常是直截了当的;我们只需要考虑集合,而不是列表

实体的幂等集合比较棘手;如果请求包含新实体的标识符,或者如果我们可以根据提供的数据计算出一个标识符,那么我们可以将我们的集合视为一个散列。

如果这些方法都不适合,那么还有另一种可能性。我们不执行集合的幂等突变,而是使集合本身的突变是幂等的。想想“比较和交换”——我们将识别集合当前状态的信息编码到请求信息中;是当请求到达时状态仍然是当前状态,然后应用突变。如果条件不成立,则请求变为空操作。

将其转换为 HTTP,我们对用于更新集合资源的协议(protocol)进行了小幅修改。首先,我们获取当前表示;服务器在元数据中提供 validators可以在后续请求中使用。获得验证器后,客户端评估资源的当前表示以确定是否需要更改它。如果客户决定进行更改,则使用 If-Match 提交更改。或 If-Unmodified-Since header 包括验证器。服务器在处理请求之前会考虑验证器,立即放弃带有 412 Precondition Failed 的请求。 .

因此,如果有条件的状态更改请求丢失,客户端可以自行决定重复请求,而不必担心服务器会误解客户端的意图。

关于rest - 如何处理 REST POST 请求中的网络连接丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46104869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com