浏览器network中的ping请求
Chrome浏览器的network中经常会看到ping类型的请求,好奇是怎么发起又有什么作用呢。这里分析总结下。
navigator.sendBeacon
调查后发现ping类型请求是通过navigator.sendBeacon
发起,该方法可携带数据。实际上发送的还是post请求。即服务端还是按照post请求去处理和返回。
该请求是由浏览器异步发起的,发起方是navigator并非是所在网页内的单线程JS。由于这个特性,网页的开关不会影响这个请求的执行。
举个例子
比如unload页面时,可以通过sendBeacon发送请求告诉服务端用户关闭了网页,如果是传统的使用XHR或者fetch,其实可能请求还没发出去网页就已经关闭,而通过sendBeacon就没有这种风险。
极端情况下除外,比如浏览器异常关闭或者电脑直接关机了,这种肯定是没办法了。
不同浏览器下的不同表现
sendBeacon请求在不同浏览器下显示上会有所不同。
- Chrome显示为bing类型
- Safari显示为beacon类型
- Firefox显示为beacon类型
不过糟糕的是以Chrome为例,在network中无法直接快速筛选出ping类型请求,只能选择other或者通过请求URL去筛选。
发起ping类型请求
具体如何发起该请求呢,这里举个例子。
1 | navigator.sendBeacon('/beacon', new Blob([JSON.stringify({ |
使用场景
该方法的特性决定了很适合做数据埋点,比如页面关闭时发送消息。
在实际的项目中我也发现数据上报类库会采用sendBeacon来实现。
写在最后
我所了解的就这些了。