用户在页面离开时发送http请求,如何成功

项目场景:

用户在离开页面时,发送http请求给后端,用来收集用户日志数据进行业务分析


问题描述

在浏览器内多页面发生跳转时,无法保证当前页面进程内的请求能够顺利完成,大多数情况下会被浏览器cancled, 请求不能到达后端服务器。

这些http请求能否成功依赖于下面几点:网络连接速度、应用程序性能、甚至于外部服务器本身的配置,可以尝试用下面代码解决

javascript 复制代码
document.getElementById('link').addEveentListener('click', (e) => {
	e.perventDefault();
	fetch("/log", {
		method: "post",
		headers: {
			"Content-Type": "application/json"
		},
		body: JSON.stringify({
			name: "123"
		})
	})
	window.location = e.target.href;
})

但 fetch 会被加入异步队列,页面跳转时队列中剩余的请求仍会被 cancled。

那我们等待请求完成之后再 location 不就行了吗?

javascript 复制代码
document.getElementById('link').addEveentListener('click', async(e) => {
	e.perventDefault();
	await fetch("/log", {
		method: "post",
		headers: {
			"Content-Type": "application/json"
		},
		body: JSON.stringify({
			name: "123"
		})
	})
	window.location = e.target.href;
})

上述代码貌似可以,但是在移动端300ms延迟都能明显感受,万一接口返回太慢,用户就会觉得网站很卡

解决方案:

好在目前前端浏览器都是现代浏览器, fetch提供了 keeplive 参数来处理这个问题:

javascript 复制代码
document.getElementById('link').addEveentListener('click', (e) => {
	 
	fetch("/log", {
		method: "post",
		headers: {
			"Content-Type": "application/json"
		},
		body: JSON.stringify({
			name: "123"
		}),
		keepalive: true  // 设置保持请求
	})
	 
})

使用keepalive 不需要我们阻止默认行为,也不需要 location 跳转。就可以使这个请求发出去


另外

在axios 中也可以设置 keepalive,具体配置如下

是的,如果您创建自己的 axios 实例,您可以使用 axios 执行此操作。

javascript 复制代码
const instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'},
  httpAgent: new http.Agent({ keepAlive: true }),
});
相关推荐
Anthony_2314 分钟前
Nginx基础
服务器·nginx·http·https·edge浏览器·web
myy-learn18 分钟前
33-HTTP协议TCP网页设计相关知识
tcp/ip·http
网硕互联的小客服32 分钟前
如何在Ubuntu系统上查看和刷新DNS缓存?操作方法与原理解析
运维·服务器·网络·ubuntu
Lynne3091 小时前
工业边缘计算网关到底解决什么问题?从设备接入到AI推理的技术链路
网络·数据分析·数据
鲁邦通物联网1 小时前
海外设备怎么远程维护?工业路由器远程运维架构设计
运维·网络·智能路由器·工业路由器·工业级路由器·5g路由器·5g工业路由器
艾芯微科技1 小时前
ESDUNL24VC1 单向 ESD 静电保护二极管参数、电路设计与 PCB 防护布局
网络·单片机·嵌入式硬件·集成测试·51单片机
❁满城风絮*2 小时前
Nginx—从默认页面到高性能网
网络·nginx
java_nnnn2 小时前
面试题(网络部分前传)-13问
服务器·网络·网络协议·tcp/ip·面试
码少女3 小时前
Linux--套接字编程
linux·服务器·网络
上海云盾-小余3 小时前
业务被 DDoS 打崩?四层、七层攻击特征与防护方案复盘
网络·网络协议·tcp/ip·ddos