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

Я думаю, что у Дэна Беккера есть правильная идея, но переизбрание abs(C-B) и abs(C-A) означает, что сравниваются обновленные матрицы, а не оригинальные .

Я не думаю, что это то, что вы хотите, так что это исправленная версия его метода:

CmA = abs(C-A);
CmB = abs(C-B);

ind = Cma < CmB; C(ind) = A(ind);
ind = CmA > CmB; C(ind) = B(ind);
C(CmA == CmB) = 0;
382
задан Community 23 May 2017 в 11:47
поделиться

6 ответов

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


Для Запросов Ajax:

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

myXMLHttpRequest.getAllResponseHeaders();

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


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

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

следующее несколько предложений для того, чтобы обходить ту проблему.


1. Запросы на Ресурсах, которые являются в основном статичны

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

function fetchSimilarHeaders (callback) {
    var request = new XMLHttpRequest();
    request.onreadystatechange = function () {
        if (request.readyState === XMLHttpRequest.DONE) {
            //
            // 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, Вы могли бы выполнить итерации через них на сервере и передать их обратно как скрытые значения в разметке. Это, вероятно, не идеально для отправки, заголовок оценивает этот путь, но Вы могли, конечно, сделать это для определенного значения, в котором Вы нуждаетесь. Это решение возможно неэффективно также, но оно сделало бы задание при необходимости в нем.

290
ответ дан Poul Bak 23 May 2017 в 11:47
поделиться

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

9
ответ дан savetheclocktower 23 May 2017 в 11:47
поделиться
  • 1
    Что я могу сказать? I' ve осуществлен;) – James Raybould 26 July 2010 в 20:57

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

var request = new XMLHttpRequest();
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
request.open("GET", path, true);
request.send(null);
5
ответ дан user4020527 23 May 2017 в 11:47
поделиться
  • 1
    Да, что он сказал, 48 секунд быстрее, чем я. – Paul Tomblin 26 July 2010 в 20:56

Используя mootools, можно использовать this.xhr.getAllResponseHeaders ()

3
ответ дан 23 May 2017 в 11:47
поделиться
  • 1
    Не уверенный, что версия хрома, но 27 дает следующей ошибке: " Перекрестные запросы источника только поддерживаются для HTTP." – Rob 13 June 2013 в 16:20

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

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

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

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

27
ответ дан Marius Bancila 23 May 2017 в 11:47
поделиться
  • 1
    Был бы " преднамеренный practice" отвечать всем требованиям? – Thorbjørn Ravn Andersen 26 July 2010 в 22:43

Ссылка Allain Lalonde сделала мой день. Просто добавив некоторый упрощенный и модернизированный реальный HTML-код здесь.
Работы с любым разумным браузером включая IE9 и Presto-Opera  12.

<!DOCTYPE html>
<title>(XHR) Show all response headers</title>

<h1>All Response Headers with XHR</h1>
<script>
 var X= new XMLHttpRequest();
 X.open("HEAD", location);
 X.send();
 X.onload= function() { 
   document.body.appendChild(document.createElement("pre")).textContent=
     X.getAllResponseHeaders();
 }
</script>

Примечание: Вы получаете заголовки второго запроса, результат может отличаться от начального запроса.

<час> РЕДАКТИРОВАНИЕ: Иначе должен использовать современное fetch() API
https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch
На caniuse.com , он поддерживается Firefox  40, Chrome  42, Edge  14 и Safari  11
Рабочий пример кода:
<!DOCTYPE html>
<title>fetch() all Response Headers</title>

<h1>All Response Headers with fetch()</h1>
<script>
 var x= "";
 if(window.fetch)
   fetch(location, {method:'HEAD'}).then(function(r) {
     r.headers.forEach(function(v,i) {x+= (i+ "\t\t"+ v+ "\n")});
   }).then(function() {
     document.body.appendChild(document.createElement("pre")).textContent= x;
   })
</script>
0
ответ дан 22 November 2019 в 23:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: