美文网首页
ResourceType等于ping的请求你见过吗

ResourceType等于ping的请求你见过吗

作者: 相遇一头猪 | 来源:发表于2022-01-06 20:55 被阅读0次

背景

发现掘金请求中有一些请求类型是ping(目前只有比较新的chrome版本能看到),好奇是这种ping类型请求是使用什么发出来的。

image

查MDN文档发现ResourceType其实有记录这种类型:

image

也就是说ping类型其实有2种:

  • a标签ping属性
  • 浏览器Beacon

掘金的ping类型请求属于第二种,本文主要介绍第二种。

点击请求list的Initiator查看具体发起该请求的代码:

image

格式化代码后,代码如下:

image

可以看到是用了navigator.sendBeacon() 方法。

navigator.sendBeacon()

navigator.sendBeacon() 方法可用于通过HTTP将少量数据异步传输到Web服务器。

navigator.sendBeacon(url, data)接受两个参数:

  • url,请求的地址

  • data,请求的数据, 可以是 ArrayBufferViewBlob, DOMString 或者FormData类型的数据。

📢:该请求是post请求,成功返回true,失败返回false。

相对于xhr发送的请求有什么优点

sendBeacon() 的适用场景是埋点,用户行为分析等,特别是对于需要在页面卸载时发送的埋点。

如果使用xhr要在页面卸载时发送埋点需要怎么做?
常见的方案是在 unload 事件处理器中发起一个同步请求来发送数据,但是这种做法会导致页面卸载被延时。
为什么不用异步请求呢?
异步请求,很可能在它即将发送的时候,页面已经卸载了,从而导致请求被canceled或者发送失败。
而用sendBeacon()发送请求可以保证不拖延页面卸载并且请求也能发送出去。

为什么页面卸载也能正常发送请求

这不得不提到fetch,fetch选项有一个keepalive的配置。

image

keepalive用于页面卸载时,告诉浏览器在后台保持连接,继续发送数据。而sendBeacon() 底层就是使用fetch。

sendBeacon传输不止有传输长度的限制(约65536个字符),数据大小的限制64kb,这些都是浏览器层面的限制,不同的浏览器可能还存在细微的差别。https://stackoverflow.com/questions/28989640/navigator-sendbeacon-data-size-limits

兼容性

除了IE之外的绝大多数浏览器都开始支持了。

image

总结

如果浏览器支持navigator.sendBeacon(),推荐使用如下写法:

// ......data是需要上报的数据
if(navigator.sendBeacon) {
    const status = navigator.sendBeacon('domain.com/api/postData',
                     JSON.stringify(data));
} else {
    // 使用向下兼容的方式
}

相关文档

https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType
https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator/sendBeacon
https://stackoverflow.com/questions/28989640/navigator-sendbeacon-data-size-limits

相关文章

  • ResourceType等于ping的请求你见过吗

    背景 发现掘金请求中有一些请求类型是ping(目前只有比较新的chrome版本能看到),好奇是这种ping类型请求...

  • 火山爆发的爱情

    你见过火山爆发吗?请记住那是大地爱上地球的记忆,你见过雪花飘落吗?请记住那是天空的老婆,你见过枫叶落下吗?...

  • Error:Error: Expected resource o

    Error:Error: Expected resource of type id [ResourceType]打...

  • ping命令

    A电脑(192.168.2.135)发起ping请求,ping 192.168.2.179 A电脑广播发起ARP请...

  • 人鱼

    「让我进去吧,求你了。」 它说。 (一) 「你见过人鱼吗?」 「我见过。」我说。 (二) 我想我永远都不能...

  • Android打包错误

    Expected resource of type id [ResourceType] 今天刚升级完Android...

  • 布衣之怒,血溅五步

    失踪 “喂!警察吗?我要报案,我儿子不见了,求你们帮我找回我的孩子,求你了。”“您别急,请”警察的话还没有说完,便...

  • 游长城(画)

    游长城,长城你们见过吗?你们没有见过的扣个一件我得扣个二行吗记得给我关注好不好!求求你们给我点小关注吧爸爸让我写很...

  • 第8章 相同却又不同读后感

    时代在发展,但为什么学校却总是变化不大?有人说,学校就是学校,见过一所,就等于见过所有的了。你同意吗? ...

  • 虚拟机中Linux ping主机丢失数据包

    我是在linux和windows互ping可以通过的情况下遇到的,如果互ping不能通过,请检查网络接线...

网友评论

      本文标题:ResourceType等于ping的请求你见过吗

      本文链接:https://www.haomeiwen.com/subject/ibfdcrtx.html