К сожалению, нет 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, вы можете перебирать их на сервере и отправлять обратно как скрытые значения в разметке. Вероятно, не стоит отправлять значения заголовков таким образом, но вы, безусловно, можете сделать это для нужного вам значения. Это решение, возможно, тоже неэффективно, но оно бы сработало, если бы оно вам понадобилось.