Niestety nie ma interfejsu API zapewniającego nagłówki odpowiedzi HTTP dla pierwszego żądania strony. To było pierwotne pytanie zadane tutaj. To pytanie też było wielokrotnie zadawane , ponieważ niektóre osoby chciałyby uzyskać nagłówki odpowiedzi na oryginalne żądanie strony bez wydawania kolejnego.
W przypadku żądań AJAX:
Jeśli przez AJAX zostanie wysłane żądanie HTTP, możliwe jest uzyskanie nagłówków odpowiedzi za pomocą tej getAllResponseHeaders()
metody. Jest to część interfejsu API XMLHttpRequest. Aby zobaczyć, jak można to zastosować, sprawdź fetchSimilarHeaders()
poniższą funkcję. Pamiętaj, że jest to obejście problemu, które nie będzie niezawodne w niektórych aplikacjach.
myXMLHttpRequest.getAllResponseHeaders();
Nie dostarczy Ci informacji na temat nagłówków odpowiedzi HTTP na żądanie strony, ale może być wykorzystany do wyuczonego odgadnięcia, jakie były te nagłówki. Więcej na ten temat opisano dalej.
Pobieranie wartości nagłówka z początkowego żądania strony:
To pytanie zostało po raz pierwszy zadane kilka lat temu, pytając konkretnie o to, jak uzyskać oryginalne nagłówki odpowiedzi HTTP dla bieżącej strony (tj. samej strony, na której działał javascript). To jest zupełnie inne pytanie niż po prostu uzyskanie nagłówków odpowiedzi dla dowolnego żądania HTTP. W przypadku pierwszego żądania strony nagłówki nie są łatwo dostępne w języku JavaScript. To, czy wartości nagłówków, których potrzebujesz, będą niezawodnie i wystarczająco spójne, jeśli ponownie zażądasz tej samej strony za pośrednictwem AJAX, będzie zależeć od konkretnej aplikacji.
Oto kilka sugestii dotyczących obejścia tego problemu.
1. Żądania dotyczące zasobów, które są w dużej mierze statyczne
Jeśli odpowiedź jest w dużej mierze statyczna, a nagłówki nie powinny się znacznie zmieniać między żądaniami, możesz złożyć żądanie AJAX dla tej samej strony, na której aktualnie się znajdujesz i założyć, że są to te same wartości, które były częścią strony Odpowiedź HTTP. To może pozwolić ci na dostęp do potrzebnych nagłówków przy użyciu ładnego interfejsu API XMLHttpRequest opisanego powyżej.
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);
}
Takie podejście będzie problematyczne, jeśli naprawdę będziesz musiał polegać na wartościach spójnych między żądaniami, ponieważ nie możesz w pełni zagwarantować, że są one takie same. Będzie to zależeć od konkretnej aplikacji i tego, czy wiesz, że potrzebna wartość jest czymś, co nie będzie się zmieniać z jednego żądania do następnego.
2. Dokonaj wnioskowania
Istnieje kilka właściwości BOM (Browser Object Model), które przeglądarka określa na podstawie nagłówków. Niektóre z tych właściwości bezpośrednio odzwierciedlają nagłówki HTTP (np. Są navigator.userAgent
ustawione na wartość User-Agent
pola nagłówka HTTP ). Wyszukując dostępne właściwości, możesz znaleźć to, czego potrzebujesz, lub kilka wskazówek, które wskazują, co zawiera odpowiedź HTTP.
3. Schowaj je
Jeśli kontrolujesz stronę serwera, możesz uzyskać dostęp do dowolnego nagłówka, który chcesz, podczas konstruowania pełnej odpowiedzi. Wartości mogą być przekazywane klientowi wraz ze stroną, ukryte w znacznikach lub być może we wbudowanej strukturze JSON. Jeśli chcesz mieć każdy nagłówek żądania HTTP dostępny w swoim javascript, możesz iterować je na serwerze i odsyłać jako ukryte wartości w znacznikach. Prawdopodobnie wysyłanie wartości nagłówka w ten sposób nie jest idealne, ale z pewnością można to zrobić dla określonej wartości, której potrzebujesz. To rozwiązanie jest również prawdopodobnie nieefektywne, ale wykonałoby zadanie, gdybyś go potrzebował.