К сожалению, не существует API, который предоставил бы вам заголовки HTTP-ответа для вашего начального запроса страницы. Это был исходный вопрос, размещенный здесь. Это неоднократно спросил, потому что некоторые люди хотели бы получать фактические заголовки ответа исходного запроса страницы, не отправляя еще один.
Для запросов AJAX:
Если HTTP-запрос выполняется через AJAX, можно получить заголовки ответа с помощью метода getAllResponseHeaders()
. Это часть API XMLHttpRequest. Чтобы увидеть, как это можно применить, ознакомьтесь с функцией fetchSimilarHeaders()
ниже. Обратите внимание, что это способ решения проблемы, который не будет надежным для некоторых приложений.
myXMLHttpRequest.getAllResponseHeaders();
Это не даст вам информации о заголовках HTTP-ответа исходного запроса страницы, но его можно использовать для обоснованного предположения о том, что это за заголовки. Подробнее об этом рассказывается далее.
Получение значений заголовка из запроса начальной страницы:
Этот вопрос впервые был задан несколько лет назад, в частности, как получить исходные заголовки HTTP-ответа для текущей страницы (т. Е. Той же страницы, внутри которой был запущен javascript). Это совсем другой вопрос, чем просто получение заголовков ответа на любой HTTP-запрос. Для исходного запроса страницы заголовки недоступны для javascript. Будет ли нужные вам значения заголовка надежно и достаточно согласованными, если вы снова запросите ту же страницу через AJAX, будет зависеть от вашего конкретного приложения.
Ниже приведены несколько советов по решению этой проблемы.
1. Запросы к ресурсам, которые в основном статичны
Если ответ в основном статический и не ожидается, что заголовки сильно изменятся между запросами, вы можете сделать запрос AJAX для той же страницы, на которой вы сейчас находитесь, и предположить, что это те же значения, которые были частью страницы. HTTP-ответ. Это может позволить вам получить доступ к нужным заголовкам с помощью красивого API XMLHttpRequest, описанного выше.
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. Делать выводы
Есть некоторые свойства спецификации (объектная модель браузера), которые браузер определяет, просматривая заголовки. Некоторые из этих свойств напрямую отражают заголовки HTTP (например, navigator.userAgent
устанавливается в значение поля заголовка HTTP User-Agent
). Обнюхивая доступные свойства, вы можете найти то, что вам нужно, или некоторые подсказки, чтобы указать, что содержится в ответе HTTP.
3. Спрятать их
Если вы контролируете сторону сервера, вы можете получить доступ к любому заголовку, который вам нравится, при построении полного ответа. Значения могут быть переданы клиенту вместе со страницей, спрятаны в некоторой разметке или, возможно, во встроенной структуре JSON. Если вы хотите, чтобы каждый заголовок HTTP-запроса был доступен для вашего javascript, вы могли бы перебирать их на сервере и отправлять обратно как скрытые значения в разметке. Вероятно, такой способ отправки значений заголовков не идеален, но вы, безусловно, можете сделать это для конкретного значения, которое вам нужно. Возможно, это решение тоже неэффективно, но оно сработает, если вам это нужно.
person
keparo
schedule
20.10.2008
Server-Timing
и передавать через него произвольные данные типа "ключ-значение". См. мой ответ. - person jakub.g   schedule 15.02.2021