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

时间:2013-11-04 14:07:26

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

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

处理该问题的官方方式是什么?我认为这是一个非常常见的问题,但我不知道它的确切名称,所以不能google它。感谢。

2 个答案:

答案 0 :(得分:1)

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

我怀疑有一种“官方”方式可以解决这个问题,但可能有一些设计模式可以解决这个问题。例如,在某些情况下,这两种选择可以解决这个问题:

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

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

答案 1 :(得分:0)

仅在客户端上修复这些问题是不可靠的。

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

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

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