К сожалению, нет 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
него установлено значение User-Agent
поля заголовка HTTP ). Обнюхивая доступные свойства, вы можете найти то, что вам нужно, или некоторые подсказки, чтобы указать, что содержится в HTTP-ответе.
3. Спрятать их
Если вы контролируете серверную часть, вы можете получить доступ к любому заголовку, который вам нравится, когда вы создаете полный ответ. Значения могут быть переданы клиенту со страницей, сохранены в некоторой разметке или, возможно, во встроенной структуре JSON. Если вы хотите, чтобы каждый заголовок HTTP-запроса был доступен для вашего javascript, вы можете перебирать их на сервере и отправлять обратно как скрытые значения в разметке. Вероятно, не стоит отправлять значения заголовков таким образом, но вы, безусловно, можете сделать это для нужного вам значения. Это решение, возможно, тоже неэффективно, но оно будет работать, если вам это нужно.