5

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

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

4

2 回答 2

3

在 REST 术语中,即如何POST调用用于创建对象(以及PUT修改、DELETE删除和GET检索)的接口,该POST操作被归为不“安全”和非“幂等”,因为每个操作的第二个操作其他类型的请愿书对对象的收集没有影响。

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

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

有用的链接,您可以在其中阅读有关 REST的更多信息。

于 2015-09-03T20:26:58.330 回答
1

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

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

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

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

于 2020-07-15T16:34:37.407 回答