javascript - 在互联网连接不稳定的客户端中保存表单数据
问题描述
我有一个用 python 编写的开源软件,它使用 Bottle Web 服务器在 Web 浏览器中显示表单。表单数据通过“method = post”发送到 Web 服务器。到目前为止,服务器进程与浏览器在同一(PC)主机上运行,因此互联网连接没有问题。
现在我必须重写这个软件,以便它可以在移动设备上使用,服务器在互联网的某个地方。进行数据输入的环境可能会导致互联网连接不稳定或丢失。因此,我必须为包含表单的网站首先加载(例如在办公室通过 WLAN),然后进行数据输入(在“字段”中)并且在数据输入期间,互联网连接丢失的情况做出规定,这样将数据保存到服务器将不起作用。在这种情况下,能够将表单数据保存在本地会很棒,以便稍后发送后请求。(在可能之前,可能无法一直保持网站打开。电池电量不足时,我会遇到问题。)
可能我不是第一个遇到这个问题的人,所以我的问题是:对于在客户端缓冲表单数据的任务是否有“标准”(或经过良好测试)解决方案,以应对未回答后请求的情况,并在以后发送相同的请求?如果没有,你将如何解决这个问题?特别是,我看到以下(子)问题:
- 如何检测(在客户端)发布请求失败?可能必须使用 javascript 中的某种超时机制,但是如何?
- 如何保存数据?我的第一个想法是使用 javascript 将数据保存到 cookie 中。我在这里忽略了什么吗?
- 以后如何发回数据?
我对python足够精通敢于这个项目,但对网络技术来说却是新手,所以如果问题的某些部分相当愚蠢,请原谅。在这种情况下,我很高兴被告知......(......提示如何提出更好的问题。)
非常感谢您的帮助。
解决方案
我将尝试根据(子)问题回答:
如何检测(在客户端)发布请求失败?可能必须使用 javascript 中的某种超时机制,但是如何?
检测请求是否失败
- 仅当您收到数据并将其保存到后端时才发送状态码 200!
- 如果有错误不要发送200!(使用错误状态码,如 5xx 或 4xx)
timeout
如果需要超过给定的时间才能完成,jquery 中有一个选项可以取消请求- 失败时,将数据保存到 localStorage
如果您不使用 jquery,我想您可以fetch
在vanilla javascript中执行类似的操作(单击此处了解更多信息fetch
)
$.ajax({
timeout: 3000 // sets timeout to 3 seconds
}).done(function () {
console.log("success");
}).fail(function () {
console.log("error");
var _local = localStorage.getItem('data-saved'); //get localStorage data
_local.push({"key": "value"}) // Append JSON based Form data
localStorage.setItem('data-saved', JSON.stringify(_local)); // Update localStorage
});
如何保存数据?我的第一个想法是使用 javascript 将数据保存到 cookie 中。我在这里忽略了什么吗?
使用保存数据localStorage
在 LocalStorage 中,您不能存储 JSON,但是可以使用保存JSON.stringify
和加载回JSON.parse
// Get data
var get_local_data = JSON.parse(localStorage.getItem('data-saved'));
// Update Data
get_local_data.append({"Name": "value", "age": 10})
// Update localStorage
localStorage.setItem('data-saved', JSON.stringify(get_local_data));
以后如何发回数据?
setTimeout
使用javascript中的方法发回数据
不断检查localStorage的key中是否有数据。如果有任何发送ajax请求到后端!
// Run in each 5 Sec
setTimeout(function () {
// Check if we have any failed data
var get_local_data = JSON.parse(localStorage.getItem('data-saved'));
if(get_local_data.length > 0){
//Make a ajax request
//Update localStorage if success (You need to remove the data from the localStorage),
//Ignored failed case
}
}, 5000);
推荐阅读
- android - Exoplayer2 流式传输 HLS 视频,有时仅播放有声视频(未播放视频)
- opencv - 如果我在具有恒定分辨率的相机中设置较小的分辨率会怎样?
- javascript - 如何在 Owl Carousel (2) 中为 Angular 2/7 实现 onChange 事件/回调/自定义点
- android - 颤振错误无法确定任务':app:compileDebugJavaWithJavac'的依赖关系
- express - Fastify 和 Express 可以一起运行吗?
- php - Laravel SQL Query 相似词搜索
- java - 如何告诉 Android Studio 方法不返回
- angular - Observable rxjs/Observable 的导入不起作用
- python - 我应该如何每五年增加一个值并将这些值放入 Python 中的列表中?
- angularjs - 将 curl 与 AngularJS 和 bash 一起使用