如何避免丢失 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 错误