| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 如何在页面关掉之后发送一个可靠的 http 请求 -> 正文阅读 |
|
[网络协议]如何在页面关掉之后发送一个可靠的 http 请求 |
埋点是一个很常见的需求。常见做法是在用户做出一定行为之后提交一个请求,比如用户点击按钮、跳转到其他页面、提交表单等等。考虑下面这个例子:
不复杂的逻辑。当用户点击 a 标签的时候向服务器会发送一个请求,并且这里不需要知道服务器的响应,只要发送请求就可以了。 问题这段代码有什么问题吗?其实是有的:浏览器并不会保证页面离开之后的请求。 如果某些行为导致页面「中断」,浏览器不会确保页面进程内的请求被成功发出(这里描述了什么是「中断」和页面的生命周期模型)。请求的可靠性和以下方面息息相关:
所以,如果某些数据驱动的业务用这些埋点数据来做一些决策,那可能会有非常严重的潜在问题。 问题复现这个问题很容易复现。在另外一个页面里,我们可以通过在 Chrome Devtools 里限制网速为 然后点击链接,会发现请求的状态是 并且,这个问题如果通过重写 请求为什么会被丢弃根本原因在于,XHR 请求(包括 XMLHttpReqeust 和 fetch)都是异步非阻塞的。一旦请求进入队列之后,就交由浏览器来控制这些请求的生命周期了。 从性能的角度来说,无可厚非。毕竟谁也不希望一个请求直接把页面搞崩了。不过这也意味着我们要承担页面进入终止状态的时候,请求会被丢弃的风险。 Google 给出了状态定义:
简单来说,就是浏览器被设计成只要页面不存在了,就不应该再执行队列中相对应的任务。 解决方案一、异步变同步在 Chrome 80 前的版本,可以通过给 XMLHttpRequest 选项加上一个配置可以开启把异步的请求变成同步调用,但这违背了请求 api 的设计初衷,所以被废弃了。 取而代之的方法是,通过
这种做法存在几个问题:
二、让浏览器保留请求实际上,浏览器提供了让请求保留的接口的方法。比如 fetch 的
加上这个字段之后,让我们再操作一下之前的例子。 当 a 标签被点击的时候,原来被 三、使用 beacon使用
beacon 请求不允许自定义头,如果需要发送 JSON 数据,使用 Blob:
那么 beacon 和 fetch 相比有什么好处呢?答案是,beacon 的发送优先级更低。 在 Chrome Devtools 里可以看到,如果同时发送 beacon 和 fetch 请求,在 Priority 列里,fetch 为 high,beacon 为 low;而在 Type 列中,beacon 是 ping 类型的。 这里是 beacon 请求的定义:
如果是和页面数据不相关的请求,优先级越低越好。换句话说,beacon 请求不会影响用户正常行为的体验。 四、HTML ping 属性越来越多的浏览器支持 a 标签的 ping 属性,用法如下:
点击了 a 标签之后,会发送一个包含信息头部的请求:
这里技术上和 beacon 请求类似,但有几个要注意的限制:
如果不受上述限制的影响,那么 ping 属性是一个很好的选择。因为完全不需要写额外的 js 代码。 总结总而言之,其实目前比较可用的方法就是使用 fetch 的 keepalive 字段或者使用 beacon 请求。 什么时候使用 fetch:
什么时候使用 beacon:
|
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:15:36- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |