我有一个 iOS 应用程序,每次事务完成时,我都会将事务POST
到 API。从服务器获得 200 响应代码
后,我更新交易的属性:
newTransaction.Synced = true
如果网络连接断开,我还会POST
每个事务,其中 Synced = false
当 Reachability 检测到网络连接时。
在完美的网络条件下,这很有效。然而,当我在我的 iPad 上启用 Network Link Conditioner 并将丢包率设置为 40% 时,我开始在我的服务器上看到重复的事务。我假设正在发生的事情是,由于丢包率高,发送我的请求并从服务器获得响应所花费的时间超过 30 秒(请求的客户端超时)。
为了证实这一点,我让我的 API 为每个 Web 请求休眠 40 秒,并禁用网络链接调节器。正如预期的那样,iOS 应用从不将Synced
属性设置为true
,因为它在收到响应之前超时。然而,服务器仍然为每次 iOS 应用程序启动或获得网络连接时生成的每个 POST
请求创建实体。
处理这种情况以防止出现重复的最佳方法是什么?我确实考虑过将 GUID 添加到事务中,然后对 API 进行编码,以便在 GUID 已经存在的情况下不重新添加事务。然而,另一方面是 iOS 应用程序永远不会知道交易已成功同步。有没有更好的方法来处理这个问题?也许是服务器也遵守的请求超时?
最佳答案
您将 GUID 分配给事务的想法很好,但您可能需要在客户端(浏览器内存)维护一个表,该表将保存您对服务器所做的所有调用的记录,但从未收到回复。
关于ios - POST 请求花费的时间超过超时导致重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34422727/