HTTP-запрос перед загрузкой: sendBeacon vs img.src - PullRequest
6 голосов
/ 29 марта 2019

В контексте обработчика beforeunload, какова функциональная разница между fetch(keep-alive: true) и установкой атрибута src тега img, и какой из них является предпочтительным методом для выполнения запросов GET?

Справочная информация:

Я хочу отправить HTTP-запрос GET в обработчике beforeunload в коде JavaScript.В документации Navigator.sendBeacon обсуждается, насколько он хорош для этого варианта использования, , но

Метод sendBeacon () не предоставляет возможности настроить метод запроса

Очевидно, было несколько запросов на такую ​​функциональность несколько лет назад, которые достигли кульминации в рекомендации , чтобы использовать fetch(),Метод браузера, вызываемый изнутри sendBeacon, с некоторыми определенными флагами, установленными для решения проблемы запроса unload:

Приложения, для которых требуются нестандартные настройки для таких запросов, должны использовать API FETCH сфлаг keep-alive установлен в true

fetch(url, {
  method: ..., 
  body: ...,            
  headers: ...,       
  credentials: 'include',
  mode: 'cors',
  keep-alive: true,
})

Насколько я могу судить, этот тип вызова будет функционально эквивалентен Navigator.sendBeacon, при этом значение ключа будет keep-alive: true.

Видимо, тег HTML <img> также использует keep-alive: true в соответствии со спецификацией (выделено мной):

Запрос связан сфлаг keepalive ... Это можно использовать для разрешения запросажить объект настроек среды, например, navigator.sendBeacon и элемент HTML img установить этот флаг

Насколько я понимаю, эта документация заключается в том, что выполнение запроса GET на unload через img атрибут *1056* элемента функционально эквивалентен вызову fetch() с keep-alive: true, что само по себе 1061 * функционально эквивалентно вызову sendBeacon (если sendBeacon может сделать GETзапросы).

Это точно?

1 Ответ

2 голосов
/ 30 марта 2019

Согласно https://fetch.spec.whatwg.org/#request-class это keepalive, а не keep-alive.

Кроме этого, да. Эта функция была добавлена ​​в fetch(), чтобы устареть необходимость в sendBeacon().

...