Доступ к заголовкам HTTP веб-страницы в JavaScript

Как получить доступ к заголовкам HTTP-ответов страницы через JavaScript?

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

по теме:
как получить доступ к полям заголовка HTTP-запроса через JavaScript?

15 ответов


невозможно прочитать текущие заголовки. Вы можете сделать другой запрос на тот же URL и прочитать его заголовки, но нет никакой гарантии, что заголовки точно равны текущему.


используйте следующий код JavaScript, чтобы получить все заголовки HTTP, выполнив get запрос:

var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
alert(headers);

к сожалению, нет API, чтобы дать вам заголовки ответов HTTP для вашего первоначального запроса страницы. Это был первоначальный вопрос, размещенный здесь. Это было неоднократно просил тоже, потому что некоторые люди хотели бы получить фактические заголовки ответов исходного запроса страницы без выдачи другого.


для запросов AJAX:

если HTTP-запрос выполняется через AJAX, можно получить заголовки ответов с помощью getAllResponseHeaders() метод. Это часть API XMLHttpRequest. Чтобы узнать, как это можно применить, проверьте fetchSimilarHeaders() ниже. Обратите внимание, что это обходной путь к проблеме, которая не будет надежной для некоторых приложений.

myXMLHttpRequest.getAllResponseHeaders();

это не даст вам информацию о заголовках HTTP-ответа исходного запроса страницы, но его можно использовать для создания обоснованных догадок о том, что заголовки были. Подробнее об этом описано далее.


получение значений заголовка из начального запроса страницы:

этот вопрос был впервые задан несколько лет назад, спрашивая конкретно о том, как получить исходные заголовки ответов HTTP для текущей страницы (т. е. та же страница, внутри которой был запущен javascript). Это совсем другой вопрос, чем просто получение заголовков ответов для любого HTTP-запроса. Для начальной страницы запрос, заголовки не доступны для javascript. Будут ли необходимые значения заголовка надежно и достаточно согласованы, если вы снова запросите ту же страницу через AJAX, будет зависеть от вашего конкретного приложения.

ниже приведены несколько предложений для решения этой проблемы.


1. Запросы на ресурсы, которые, в основном, статичны

если ответ в основном статический, и заголовки, как ожидается, не сильно изменятся между запросами вы можете сделать запрос AJAX для той же страницы, на которой вы сейчас находитесь, и предположить, что они являются теми же значениями, которые были частью HTTP-ответа страницы. Это может позволить вам получить доступ к заголовкам, которые вам нужны, используя nice XMLHttpRequest API, описанный выше.

function fetchSimilarHeaders (callback) {
    var request = new XMLHttpRequest();
    request.onreadystatechange = function () {
        if (request.readyState === 4) {
            //
            // The following headers may often be similar
            // to those of the original page request...
            //
            if (callback && typeof callback === 'function') {
                callback(request.getAllResponseHeaders());
            }
        }
    };

    //
    // Re-request the same page (document.location)
    // We hope to get the same or similar response headers to those which 
    // came with the current page, but we have no guarantee.
    // Since we are only after the headers, a HEAD request may be sufficient.
    //
    request.open('HEAD', document.location, true);
    request.send(null);
}

этот подход будет проблематичным, если вам действительно придется полагаться на значения, согласованные между запросами, поскольку вы не можете полностью гарантировать, что они одинаковы. Это будет зависеть в вашем конкретном приложении и знаете ли вы, что необходимое вам значение-это то, что не будет меняться от одного запроса к другому.


2. Делайте Выводы

здесь некоторые свойства BOM (объектная модель браузера), которую браузер определяет, просматривая заголовки. Некоторые из этих свойств отражают заголовки HTTP напрямую (например,navigator.userAgent имеет значение HTTP User-Agent поля заголовка). Обнюхивая доступные свойства вы можете найти то, что вам нужно, или некоторые подсказки, чтобы указать, что содержал HTTP-ответ.


3. Заначку них

если вы контролируете серверную сторону, вы можете получить доступ к любому заголовку, который вам нравится, когда вы строите полный ответ. Значения могут передаваться клиенту со страницей, храниться в некоторой разметке или, возможно, в встроенной структуре JSON. Если вы хотите, чтобы каждый заголовок HTTP-запроса был доступен для вашего javascript, вы можете выполнить итерацию их на сервере и отправить их обратно в виде скрытых значений в разметке. Вероятно, не идеально отправлять значения заголовков таким образом, но вы можете сделать это для конкретного значения, которое вам нужно. Это решение, возможно, тоже неэффективно, но оно сделает работу, если вам это нужно.


используя XmlHttpRequest вы можете вытащить текущую страницу, а затем изучить заголовки http ответа.

лучший вариант-просто сделать HEAD запросить, а затем изучить заголовки.

для некоторых примеров этого посмотрите на http://www.jibbering.com/2002/4/httprequest.html

просто мои 2 цента.


решение с работниками сферы обслуживания

работники сервиса могут получить доступ к сетевой информации, которая включает заголовки. Хорошая часть заключается в том, что он работает с любым запросом, а не только с XMLHttpRequest.

как работает:

  1. добавьте работника службы на свой веб-сайт.
  2. следите за каждым запросом, который отправляется.
  3. сделать работника службы fetch запрос

еще один способ отправить информацию заголовка в JavaScript - через cookies. Сервер может извлекать любые необходимые ему данные из заголовков запросов и отправлять их обратно в Set-Cookie заголовок ответа-и cookies можно прочитать в JavaScript. Как говорит кепаро, лучше всего сделать это только для одного или двух заголовков, а не для всех из них.


для тех, кто ищет способ проанализировать все HTTP-заголовки в объект, к которому можно получить доступ как к словарю headers["content-type"] Я создал функцию parseHttpHeaders:

function parseHttpHeaders(httpHeaders) {
    return httpHeaders.split("\n")
     .map(x=>x.split(/: */,2))
     .filter(x=>x[0])
     .reduce((ac, x)=>{ac[x[0]] = x[1];return ac;}, {});
}

var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = parseHttpHeaders(req.getAllResponseHeaders());
// Now we can do:  headers["content-type"]

Если мы говорим о запрос заголовки, вы можете создавать свои собственные заголовки при выполнении XmlHttpRequests.

var request = new XMLHttpRequest();
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
request.open("GET", path, true);
request.send(null);

вы не можете получить доступ к заголовкам http, но некоторая информация, представленная в них, доступна в DOM. Например, если вы хотите увидеть HTTP referer (sic), используйте document.ссылающаяся страница. Для других HTTP-заголовков могут быть другие, подобные этому. Попробуйте погуглить конкретную вещь, которую вы хотите, например "HTTP referer javascript".

Я знаю, что это должно быть очевидно, но я продолжал искать такие вещи, как" HTTP-заголовки javascript", когда все, что я действительно хотел, было референтом, и не получил полезный результат. Я не знаю, как я не понял, что могу сделать более конкретный запрос.


используя mootools, вы можете использовать это.то XHR.getAllResponseHeaders()


Как и многие люди, я копал сеть без реального ответа : (

тем не менее я нашел обходной путь, который может помочь другим. В моем случае я полностью контролирую свой веб-сервер. На самом деле это часть моего приложения (см. end reference). Мне легко добавить скрипт в свой http-ответ. Я изменил свой сервер httpd, чтобы ввести небольшой скрипт на каждой html-странице. Я только нажимаю дополнительную строку "JS script" сразу после моей конструкции заголовка, которая устанавливает существующую переменную из моего документ в моем браузере [я выбираю местоположение], но возможен любой другой вариант. Хотя мой сервер написан на nodejs, я не сомневаюсь, что тот же метод можно использовать из PHP или других.

  case ".html":
    response.setHeader("Content-Type", "text/html");
    response.write ("<script>location['GPSD_HTTP_AJAX']=true</script>")
    // process the real contend of my page

теперь все html-страницы, загруженные с моего сервера, имеют этот скрипт, выполняемый браузером на приеме. Затем я могу легко проверить из JavaScript, существует ли переменная или нет. В моем usecase мне нужно знать, должен ли я использовать профиль JSON или JSON-P, чтобы избежать проблемы CORS, но тот же метод может использоваться для других целей [т. е.: выберите между сервером разработки / производства, получите от сервера ключ REST/API и т. д....]

в браузере вам просто нужно проверить переменную непосредственно из JavaScript, как в моем примере, где я использую ее для выбора моего профиля json / JQuery

 // Select direct Ajax/Json profile if using GpsdTracking/HttpAjax server otherwise use JsonP
  var corsbypass = true;  
  if (location['GPSD_HTTP_AJAX']) corsbypass = false;

  if (corsbypass) { // Json & html served from two different web servers
    var gpsdApi = "http://localhost:4080/geojson.rest?jsoncallback=?";
  } else { // Json & html served from same web server [no ?jsoncallback=]
    var gpsdApi = "geojson.rest?";
  }
  var gpsdRqt = 
      {key   :123456789 // user authentication key
      ,cmd   :'list'    // rest command
      ,group :'all'     // group to retreive
      ,round : true     // ask server to round numbers
   };
   $.getJSON(gpsdApi,gpsdRqt, DevListCB);

для тех, кто когда-либо хотел бы проверить мой код: https://www.npmjs.org/package/gpsdtracking


Я только что протестировал, и это работает для меня с помощью Chrome версии 28.0.1500.95.

мне нужно скачать файл и прочитать имя файла. Имя файла в заголовке, поэтому я сделал следующее:

var xhr = new XMLHttpRequest(); 
xhr.open('POST', url, true); 
xhr.responseType = "blob";
xhr.onreadystatechange = function () { 
    if (xhr.readyState == 4) {
        success(xhr.response); // the function to proccess the response

        console.log("++++++ reading headers ++++++++");
        var headers = xhr.getAllResponseHeaders();
        console.log(headers);
        console.log("++++++ reading headers end ++++++++");

    }
};

выход:

Date: Fri, 16 Aug 2013 16:21:33 GMT
Content-Disposition: attachment;filename=testFileName.doc
Content-Length: 20
Server: Apache-Coyote/1.1
Content-Type: application/octet-stream

Это старый вопрос. Не уверен, когда поддержка стала более широкой, но getAllResponseHeaders() и getResponseHeader() теперь кажется довольно стандартным:http://www.w3schools.com/xml/dom_http.asp


Это мой скрипт для получения всех заголовков ответов:

var url = "< URL >";

var req = new XMLHttpRequest();
req.open('HEAD', url, false);
req.send(null);
var headers = req.getAllResponseHeaders();

//Show alert with response headers.
alert(headers);

имея в результате заголовки ответов.

enter image description here

Это тест сравнения с использованием Hurl.он:

enter image description here


Как уже упоминалось, если вы управляете серверной стороной, то должно быть возможно отправить начальные заголовки запроса обратно клиенту в начальном ответе.

В Express, например, работает следующее:

app.get('/somepage', (req, res) => { res.render('somepage.hbs', {headers: req.headers}); }) Заголовки затем доступны в шаблоне, поэтому могут быть скрыты визуально, но включены в разметку и прочитаны javascript на стороне клиента.


чтобы получить заголовки как объект, который удобнее (улучшение ответ Раджи):

var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
headers = headers.split(/\n|\r|\r\n/g).reduce(function(a, b) {
    if (b.length) {
        var [ key, value ] = b.split(': ');
        a[key] = value;
    }
    return a;
}, {});
console.log(headers);