如何避免向Web服务发送2个重复的POST请求

5
我发送了一个POST请求来创建一个对象。该对象已经成功地在服务器上创建,但我无法接收到响应(可能在某个地方丢失了),所以我尝试再次发送POST请求(多次)。结果是服务器上有许多重复的对象。
官方处理这个问题的方法是什么?我认为这是一个非常常见的问题,但我不知道它的确切名称,因此无法通过谷歌搜索。谢谢。

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

3
在REST术语中,用于创建对象的接口(使用POST)(使用PUT进行修改,DELETE进行删除和GET进行检索)被称为“不安全”和不“幂等”,因为其他类型请愿书的第二个操作对对象集合没有影响。
我怀疑是否有一个“官方”的处理方式,但可能有一些设计模式可以解决这个问题。例如,在某些情况下,以下两种替代方案可能解决此问题:
  • 对象具有唯一性约束条件。例如,存储唯一用户名的记录不能重复,因为数据库将拒绝它。
  • 在每个客户端进行POST请求之前向其发出一次性使用令牌,通常是在客户端加载带有输入表单的页面时。第一个POST创建对象并标记令牌已使用。第二个POST将看到令牌已经被使用,您可以用“是的,是的,好的,好的!”错误或成功消息回答。
有用的链接在此处阅读有关REST的更多信息

1
仅在客户端修复这些问题是不可靠的。
根据我的经验,具有大量流量的RESTful服务很可能会意外收到重复的传入POST请求-例如,有时用户会同时点击“注册”,然后会发送两个请求。你应该预料并通过后端服务处理这个问题。
当发生这种情况时,即使在用户模型上检查唯一性,也会创建两个完全相同的用户。这是因为模型上的唯一检查是使用全表扫描在内存中处理的。
解决方案:这些情况应该在后端使用唯一性检查和 SQL Server Unique Indices来处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接