2012-05-09 12 views
20

Utilizzando getAllResponseHeaders nell'oggetto xhr, è possibile ottenere tutte le intestazioni di risposta dopo una chiamata Ajax. Ma non riesco a trovare un modo per ottenere la stringa di intestazioni di richiesta, è possibile?JS/jQuery ottiene le intestazioni delle richieste HTTPRequest?

+0

Perché è necessario sapere quali sono le intestazioni delle richieste sul client? – Quentin

+2

È a scopo di debug – Lwyrn

+0

Perché non guardare le intestazioni delle richieste quando raggiungono il server? O usare un proxy come Charles? – Quentin

risposta

18

Se questo è per scopi di debug, è sufficiente utilizzare Firebug o gli Strumenti per sviluppatori di Chrome (e qualunque sia la funzione chiamata in IE) per esaminare il traffico di rete dal browser al server.

Un'alternativa sarebbe quella di utilizzare qualcosa di simile a questo script:

$.ajax({ 
    url: 'someurl', 
    headers:{'foo':'bar'}, 
    complete: function() { 
     alert(this.headers.foo); 
    } 
}); 

Tuttavia penso che solo le intestazioni già definite nel headers è disponibile (non so cosa succede se le intestazioni sono alterati (ad esempio in beforeSend) .

si potrebbe leggere un po 'di più su jQuery Ajax a: http://api.jquery.com/jQuery.ajax/

EDIT: Se si desidera catturare solo le intestazioni su tutti chiama setRequestHeader su XMLHttpRequest, quindi puoi semplicemente wrappare quel metodo. È un po 'un trucco e, naturalmente, è necessario assicurarsi che le funzioni che avvolgono il codice sottostante vengano eseguite prima che le richieste vengano eseguite.

// Reasign the existing setRequestHeader function to 
// something else on the XMLHtttpRequest class 
XMLHttpRequest.prototype.wrappedSetRequestHeader = 
    XMLHttpRequest.prototype.setRequestHeader; 

// Override the existing setRequestHeader function so that it stores the headers 
XMLHttpRequest.prototype.setRequestHeader = function(header, value) { 
    // Call the wrappedSetRequestHeader function first 
    // so we get exceptions if we are in an erronous state etc. 
    this.wrappedSetRequestHeader(header, value); 

    // Create a headers map if it does not exist 
    if(!this.headers) { 
     this.headers = {}; 
    } 

    // Create a list for the header that if it does not exist 
    if(!this.headers[header]) { 
     this.headers[header] = []; 
    } 

    // Add the value to the header 
    this.headers[header].push(value); 
} 

Ora, una volta che le intestazioni sono state impostate su un XMLHttpRequest esempio possiamo tirarli fuori esaminando xhr.headers esempio

var xhr = new XMLHttpRequest(); 
xhr.open('get', 'demo.cgi'); 
xhr.setRequestHeader('foo','bar'); 
alert(xhr.headers['foo'][0]); // gives an alert with 'bar' 
+0

Come ho scritto in un commento precedente: sto scrivendo un debugger per la mia piattaforma per aiutare gli sviluppatori a sviluppare i moduli aggiuntivi per questo. Il debugger cattura tutte le richieste Ajax e mostra tutte le informazioni richieste (intestazione risposta, dati di risposta, url, stato ecc ...).Voglio solo aggiungere le intestazioni delle richieste per avere una visione completa della richiesta. So che è possibile utilizzare strumenti di debug del browser integrati, voglio solo dare uno strumento personalizzato. Quindi le intestazioni delle richieste non possono essere intercettate :( – Lwyrn

+0

Hai guardato il w3c XMLHttpRequest Spec? Http://www.w3.org/TR/2012/WD-XMLHttpRequest-20120117 Forse potresti avvolgere l'oggetto XMLHttpRequest e quindi catturare le intestazioni mentre vengono impostate Un po 'scomode –

+1

Sì, sembra che non sia possibile catturare le intestazioni delle richieste – Lwyrn

1

Qualcosa che poteva per è utilizzare FakeXMLHttpRequest di Sinon per sostituire XHR del browser. È descritto in this document su come usarlo per il test, ma sono abbastanza sicuro che puoi usare il modulo per i tuoi scopi di debug.

Quello che dovete fare è:

var requests; 
this.xhr = sinon.useFakeXMLHttpRequest(); 
this.xhr.onCreate = function(xhr) { 
    requests.push(xhr); 
} 

E poi in seguito, è possibile controllare l'array requests per le intestazioni da:

console.log(requests[0].requestHeaders); 

Per accedere alle intestazioni di richiesta.

+0

Documentazione ufficiale: http://sinonjs.org/docs/#server – uglymunky