【问题标题】:How to avoid sending 2 duplicate POST requests to a webservice如何避免向 Web 服务发送 2 个重复的 POST 请求
【发布时间】:2024-04-19 19:05:02
【问题描述】:

我发送一个 POST 请求来创建一个对象。该对象已在服务器上成功创建,但我无法接收响应(丢弃在某处),因此我尝试再次(一次又一次)发送 POST 请求。结果是服务器端有很多重复的对象。

处理该问题的官方方法是什么?我认为这是一个非常普遍的问题,但我不知道它的确切名称,所以无法谷歌它。谢谢。

【问题讨论】:

  • 你可以为你的请求设置一个超时窗口
  • 嗨@MrKlin,我不太明白。如果我有一个超时(比如说 30 秒),那么没有响应,我仍然需要重新发送 POST 请求,并且可能会在服务器上创建 2 个重复的对象。
  • 嗨@N.Q.P,如果由于某种原因它需要服务器超过 30 秒(很长时间)处理您的请求,您可能会更改一些业务逻辑。说立即返回“接收通知”并在处理完成后引发完整标志..

标签: web-services networking post duplicates data-consistency


【解决方案1】:

在 REST 术语中,POST 用于创建对象(PUT 用于修改,DELETE 用于删除和GET 用于检索)的接口被调用,POST 操作是归因于不“安全”和非“幂等”,因为所有其他类型的请求的第二次操作对对象的集合没有影响。

我怀疑是否有“官方”的方式来处理这个问题,但可能有一些设计模式可以处理它。例如,这两种替代方案可能会在某些情况下解决此问题:

  • 对象具有唯一性约束。例如,存储唯一用户名的记录不能重复,因为数据库会拒绝它。
  • 在每个客户端发出POST 请求之前,向每个客户端发出一次性使用令牌,通常是在客户端使用输入表单加载页面时。第一个POST 创建一个对象并将令牌标记为已使用。第二个POST 将看到令牌已被使用,您可以回答“是的,是的,好的,好的!”错误或成功消息。

有用的链接where you can read more about REST

【讨论】:

    【解决方案2】:

    仅在客户端解决这些问题是不可靠的。

    根据我的经验,具有大量流量的 RESTful 服务必然会无意中收到重复的传入 POST 请求 - 例如。有时用户会点击“注册”,两个请求会同时发送;这应该由您的后端服务预期和处理。

    发生这种情况时,将创建两个相同的用户即使您检查用户模型上的唯一性。这是因为对模型的唯一检查是使用全表扫描在内存中处理的。

    解决方案:这些情况应该在后端使用唯一检查SQL Server Unique Indices来处理。

    【讨论】: