如何避免丢失 Post 请求数据

Posted

技术标签:

【中文标题】如何避免丢失 Post 请求数据【英文标题】:How to avoid losing Post request data 【发布时间】:2020-09-23 10:57:53 【问题描述】:

有时当我发布一些数据时,如果连接关闭或出现问题,我会丢失数据,这并不好,我正在寻找一种方法将数据保存在后台或类似的东西中,它会发送有连接时自动等待,同时等待我必须能够使用该应用程序,有什么想法吗?

  Post PostContact = new Post();
  json = PostContact.ContactJson(id_device1,id_device2);
  response = PostContact.post("url", json);

【问题讨论】:

您可以在调用服务器API之前检查是否有互联网连接,如果没有连接则添加侦听器以检测网络连接,当您可以上网时它会通知您并且您可以调用待处理的API @NehaK 是的,这就是我所做的,我保存数据并在有连接时发布它,但我不知道如何制作这个监听器,我运行一个服务所以应用程序在后台工作,所以当有互联网时,这个监听器会执行,它会发布保存的数据,但我对这个连接监听器一无所知! 使用 ConnectivityManager.CONNECTIVITY_ACTION medium.com/ki-labs-engineering/… 【参考方案1】:

HTTP请求函数如下

客户提出请求

服务器回复响应

他们并不真正关心中间发生的事情。这意味着一旦客户端完成了请求,之后就像一个黑匣子。如果在您的请求到来时服务器的连接中断,则数据将被破坏,并且由于没有双向通信,客户端不会知道重新发送请求。

最好的选择是创建一个交易:

客户端为请求创建一个唯一的事务 ID 并附加到 Rest 调用

服务器收到请求,检查事务日志中是否有以前的相同 id 调用。

如果是新事务,服务器会将此事务 ID 存储在状态为“待定”的日志中。然后服务器处理请求。服务器将事务日志状态更新为“已处理”。然后服务器将响应发送给客户端并将响应存储在事务日志中

如果是旧事务,服务器重新发送响应给客户端

客户端收到响应,客户端向服务器发送事务完成信号。

服务器将事务日志删除/更新为“已完成”

第5步失败,客户端可以重新发送相同事务id的请求,没有重复记录的风险

【讨论】:

以上是关于如何避免丢失 Post 请求数据的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 QNetworkAccessManager 多个 POST 请求?

如何避免 Request Entity Too Large 413 错误

04-05 | AOF日志:宕机了,Redis如何避免数据丢失?

什么是高并发,如何避免高并发

如何在我的数据库中避免 NULL,同时还表示丢失的数据?

如何避免循环内的数据丢失