我有一个iOS应用程序,每次交易完成后,我POST
会对API进行交易。从服务器获得200 response code
后,我更新了事务的属性:
newTransaction.Synced = true
随着可达性检测到网络连接的POST
,我也Synced = false
每次交易都会暂停网络连接。
在完美的网络条件下,这种方法很有效。但是,当我在iPad上启用网络链接调节器并将数据包丢失设置为40%时,我开始在服务器上看到重复的事务。我假设发生的事情是,由于数据包丢失导致我发送请求并从服务器获取响应所花费的时间超过30秒(客户端请求超时)。
为了确认这一点,我为每个Web请求启用了API Sleep 40秒,并禁用了Network Link Conditioner。正如预期的那样,iOS应用从不将Synced
属性设置为true
,因为它在获得响应之前已超时。但是,服务器仍然为每次启动iOS应用程序或获得网络连接时生成的每个POST
请求创建实体。
处理这种情况的最佳方法是什么,以便永远不会发生重复?我确实考虑过向事务添加GUID,然后编写API,如果GUID已经存在,则不会重新添加事务。然而另一方面,iOS应用程序仍然永远不会知道事务已成功同步。有没有更好的方法来处理这个?也许服务器也遵守请求的超时?
答案 0 :(得分:0)
您将GUID分配给事务的想法是好的,但您可能需要在客户端(浏览器内存)上维护一个表,该表将记录您对服务器所做的所有调用并且从未收到过回复。