Получение параметров HTTP-заголовка

Я пытаюсь написать фрагмент кода Zap с помощью Run JavaScript, чтобы проверить ответ HTTP-заголовка URL-адреса GET. В частности, меня интересует статус возврата и местоположение (в основном, если это 302, я хочу знать, где находится перенаправление).

fetch('https://www.example.com/', { method: 'GET', redirect: 'manual' })
  .then(function(res) {
    return res.json();
  })
  .then(function(json) {
    var output = {status: json.status, location: json.headers.get('location')};
    callback(null, output);
  })
  .catch(callback);

Я пробовал вышеописанное, но (а) тест всегда возвращает rawHTML (что предполагает, что он следует за перенаправлением, и (б) выходные переменные на шаге «Отправить исходящий Zap» не получают ничего полезного (опять же, «Raw HTML ", "ID", "Метажурналы времени выполнения" и т. д., но ничего о моих заголовках).


person System Noise    schedule 07.04.2017    source источник


Ответы (3)


Возможно, вы не сможете получить доступ к заголовку Location из-за одинаковой политики происхождения в большинстве браузеров: https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy

Кроме того, вы не можете остановить вызов AJAX после перенаправления, что может вызвать проблемы: Как запретить jQuery ajax следовать перенаправлению после публикации?

Похоже, вы используете новую встроенную функцию выборки: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch

Если да, то в приведенном примере я не думаю, что вам нужен вызов .json(). Я получил код для запуска, как показано ниже, но на example.com нет перенаправления, поэтому я не уверен, как именно будет обрабатываться ваша ситуация. Кроме того, имейте в виду политику того же происхождения, которая, скорее всего, запретит вам доступ к заголовку местоположения.

var callback = function(a,b){
  console.log(a,b)
};
fetch('https://www.example.com/', { method: 'GET', redirect: 'manual' })
  .then(function(res) { 
    console.log (res)
    var output = {status: res.status, location: res.headers.get('location')};
    callback(null, output);
  })
  .catch(callback);

Если вы контролируете ресурс сервера, вы можете что-то сделать на сервере, например добавить еще один заголовок, который не будет заблокирован, многие сайты делают это, добавляя опцию X-Location, которую браузеры не блокируют.

person harymitchell    schedule 07.04.2017
comment
Я не контролирую ресурс сервера, так как он работает в среде Zapier, которая выполняется под node.js (4.3.2, как они утверждают). Я не думаю, что это политика браузера того же происхождения, но симптомы указывают на невозможность заблокировать перенаправление. - person System Noise; 07.04.2017
comment
Это предполагает интерфейс на основе браузера — это Node.js. - person Bryan Helmig; 07.04.2017

Поскольку мы используем https://github.com/bitinn/node-fetch#options под капотом - особенно вариант redirect: 'follow'. Он даже предлагает точное «установить manual для извлечения заголовков перенаправления».

Вы можете попробовать поэкспериментировать с локальным REPL Node.js, чтобы понять это. Если вы видите, что он работает локально, но не в Zapier, просто отправьте сообщение об ошибке на адрес [email protected].

person Bryan Helmig    schedule 07.04.2017
comment
Удалось заставить работать локальную настройку REPL! В итоге мне пришлось копаться в тестовом коде извлечения узла, но это сработало: fetch('https://www.example.com/', { method: 'GET', redirect: 'manual', follow: 0 }).then(function(res) { return res; }).then(function(res) { var output = {location:res.headers._headers.location, status: res.status }; callback(null, output); }).catch(callback); То же самое не работает на Zapier, поэтому я зарегистрирую ошибку и отчитаюсь. - person System Noise; 10.04.2017

Мне удалось заставить этот код работать:

fetch('https://www.example.com/', { method: 'GET', redirect: 'manual', follow: 0 })
  .then(function(res) {
    var output = {status: res.status, location: res.headers._headers.location};
    callback(null, output);
  })
  .catch(callback);

Основная проблема, по-видимому, заключается в том (о чем свидетельствуют выходные переменные с «id» и «rawHTML»), что поля каким-то образом «застряли». Когда я (1) удалил шаг «Выполнить Javascript», (2) повторно вставил новый с приведенным выше кодом, правильные поля вывода были возвращены и впоследствии стали доступными для шага «Отправить исходящую электронную почту».

person System Noise    schedule 10.04.2017