2013-02-23 12 views
27

Dostaję dane odpowiedzi, ale nie mogę uzyskać moich niestandardowych danych nagłówka HTTP.Nie można uzyskać niestandardowej odpowiedzi nagłówka HTTP od Ajaxa getAllResponseHeaders

Tak, jest to żądanie między domenami. Robię żądanie Ajax z JavaScript. Próbowałem tego z XMLHttpRequest, a także jQuery $ .ajax. Zrobiłem moje ustawienia serwera, mam te usytuowane przy wysyłaniu danych:

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: POST, GET 

robię uzyskać dane odpowiedzi, że chcę. Ale nie mogę uzyskać pełnej odpowiedzi nagłówka HTTP.

W PHP, ustawiam następujące parametry przed wysłaniem odpowiedzi tekstowej. Zakładam więc, że powinienem to uzyskać za pomocą getAllResponseHeaders().

header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('My-Own-Test: nodatahere'); 

Ale oto, co mam.

Content-Type: text/plain; charset=x-user-defined 
Cache-Control: must-revalidate, post-check=0, pre-check=0 
Expires: 0 

Brakuje My-Own-Test. Tylko dla odniesienia, oto mój JavaScript:

var formData = new FormData(); 
formData.append('username', 'my_username'); 
formData.append('book_id', 'test password'); 
var xhr = new XMLHttpRequest(); 
xhr.open('POST', 'https://mydomain.com/proc.php', true); 
xhr.overrideMimeType("text/plain; charset=x-user-defined"); 
xhr.onload = function(e) { 
    console.log(this.getAllResponseHeaders()); 
}; 
xhr.send(formData); 

Próbowałem nawet z jQuery ... ten sam wynik.

var data_to_send = { 
    username: 'my_username', 
    password: 'test_password' 
}; 
var ajaxObj; 
ajaxObj = $.ajax({ 
    url: "https://mydomain.com/proc.php", 
    data: data_to_send, 
    type: "POST", 
    beforeSend: function (xhr) { 
     xhr.overrideMimeType("text/plain; charset=x-user-defined"); 
    } 
}) 
.done(function (data) { 
    console.log(ajaxObj.getAllResponseHeaders() ); 
}); 

Wciąż ... bez powodzenia.

Ale jeśli przejść przez Firebug lub Chrome narzędzie programisty, widzę, że te narzędzia wracają pełne informacje nagłówka HTTP, w tym Content-Length, Content-Encoding, Vary, X-Powered-By, Set-Cookie, Server i oczywiście My-Own-Test.

+3

Domyślam się, że to powinno pomóc: http://stackoverflow.com/a/14689355/1236044 – jbl

+1

NIESAMOWITE !!! To było zbyt łatwe. Mam 'Access-Control-Allow-Headers' ale myślę, że brakowało' Access-Control-Expose-Headers'. Tak było. Dzięki. Byłem w tyle i nie mogę uwierzyć, że to przegapiłem. Dzięki jeszcze raz. Zaoszczędziłam mnóstwo godzin, może dni. –

+0

cieszę się, że mogłem pomóc ;-) Nie zapomnij przyjąć odpowiedzi – jbl

Odpowiedz

41

Chcę podziękować jbl za skierowanie mnie do właściwego pytania SO. Mam to teraz ...

Tak, OK ... odpowiedź. Jeśli kiedykolwiek chciałeś ustawić własne informacje nagłówka HTTP, a następnie pobrać je za pomocą Ajaxu w wielu domenach, lub coś w tym stylu, oto kilka dodatkowych nagłówków HTTP, które powinieneś ustawić na stronie serwera, zanim wyślesz tekst odpowiedzi.

header('Access-Control-Allow-Origin: *'); 
header("Access-Control-Allow-Methods: POST, GET");  
header('Custom-Header: Own-Data'); 
header('Access-Control-Expose-Headers: Custom-Header'); 

Przykład powyżej używa PHP. Ale używaj własnego języka, jakiego używasz, aby je ustawić.

Kiedy zadałem to pytanie, miałem to wszystko z wyjątkiem Access-Control-Expose-Headers. Po wprowadzeniu tego, mój JavaScript Ajax może odczytać zawartość nagłówka HTTP Customer.