2016-11-10 3 views
1

Я использую navigator для связи с сервером, но проблема в том, что нам нужно передать некоторую информацию заголовка, так как есть фильтр, который распознает запрос от действительного источника.Navigator.sendBeacon() для передачи информации заголовка

Можно ли кому-нибудь помочь в этом?

Спасибо.

ответ

7

@ Vipul Panth имеет полезную информацию, но я хотел бы предоставить более подробную информацию.

Во-первых, обратите внимание, что navigator.sendBeacon не поддерживается во всех браузерах. Подробнее об этой функции, а также поддерживаемых в настоящее время браузерах см. В разделе MDN documentation.

Вы действительно создаете blob для обеспечения заголовков. Вот пример:

window.onunload = function() { 
    let body = { 
    id, 
    email 
    }; 
    let headers = { 
    type: 'application/json' 
    }; 
    let blob = new Blob([JSON.stringify(body)], headers); 
    navigator.sendBeacon('url', blob); 
}); 

navigator.sendBeacon отправит запрос POST с заголовком запроса Content-Type установлен на то, что в headers.type. Это, кажется, единственный заголовок вы можете установить в маяк, хотя, на W3C:

Метод sendBeacon не дает возможность настроить метод запроса, предоставить пользовательские заголовки запросов, или изменить другие свойства обработки запроса и ответ. Приложения, для которых требуются нестандартные настройки для таких запросов, должны использовать API [FETCH] с флагом keepalive, установленным в true.

Я смог наблюдать некоторые из того, как это сработало через этот Chromium bug report.

+0

Да, вы совершенно правы, поскольку это экспериментальный подход согласно [docs] (https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon) и доступен только в последнем браузере, таком как хром v39. –

+0

Исправьте меня, если я ошибаюсь, но keepalive for fetch еще не реализован в Chrome. https://groups.google.com/a/chromium.org/forum/#!topic/loading-dev/_F6oicQ3_F4 –

0

После поиска ответа на этот вопрос я узнал, что для прохода заголовка с навигатором нам нужно передать объект blob.

Например

var hearders = {type : 'application/json'}; 
var blob = new blob(request , headers); 
navigator.sendBeacon('url/to/send',blob); 

Спасибо.

+0

вы имели в виду, чтобы заработать 'новый blob' так, что это будет' новый Blob'? –

+0

И что такое 'request'? Можете ли вы привести какой-либо из ваших источников? –

+0

запрос, о котором я говорю, это список данных о билетах, которые необходимо отправить, в то время как браузер закрывается вместе с заголовком безопасности, чтобы сервер мог распознать его как запрос авторизации. –

0

Как написано в Processing Model of sendBeacon: поток байтов

экстракта объекта (transmittedData) и тип контента (CONTENTTYPE).

Как осуществляется добыча described here

Что я собрал в том, что тип содержимого передаваемых данных извлекается, и устанавливается как Content-Type запроса HTTP.

1) Если объект Blob отправлен, Content-Type становится типом Blob.

2) Если FormData объект отправляется, то Content-Type становится многоэкземплярных/форм-данных

3) Если объект URLSearchParams посылается, то Content-Type становится применение/х-WWW-форм-urlencoded

4) Если нормальная строка посылается, то Content-Type становится текст/обычный

код Javascript для реализации различных объектов can be found here

Смежные вопросы