2012-05-09 26 views
20

Usando getAllResponseHeaders en el objeto xhr, es posible obtener todos los encabezados de respuesta después de una llamada ajax. Pero no puedo encontrar una manera de obtener la cadena de encabezados de Solicitud, ¿es posible?JS/jQuery obtener encabezados de solicitud HTTPRequest?

+0

¿Por qué necesita saber cuáles eran los encabezados de solicitud en el cliente? – Quentin

+2

Tiene fines de depuración – Lwyrn

+0

¿Por qué no mira los encabezados de solicitud cuando llegan al servidor? ¿O usar un proxy como Charles? – Quentin

Respuesta

18

Si esto se realiza con fines de depuración, puede usar Firebug o Chrome Developer Tools (y la función que se llame en IE) para examinar el tráfico de red de su navegador al servidor.

Una alternativa sería utilizar algo como este script:

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

Sin embargo creo que sólo los encabezados ya definidos en headers disponible (no está seguro de lo que sucede si se alteran los encabezados (por ejemplo, en beforeSend) .

usted puede leer un poco más sobre jQuery Ajax en: http://api.jquery.com/jQuery.ajax/

EDIT: Si desea simplemente coger las cabeceras de todos llama a setRequestHeader en XMLHttpRequest, entonces puedes simplemente envolver ese método. Es un poco complicado y, por supuesto, deberá asegurarse de que las funciones que configuran el código siguiente se ejecuten antes de que se produzca alguna de las solicitudes.

// 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); 
} 

Ahora, una vez que las cabeceras se han establecido en una instancia XMLHttpRequest podemos sacarlos por ejemplo, mediante el examen de xhr.headers

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

Cómo escribo en un comentario anterior: estoy escribiendo un depurador para mi plataforma para ayudar a los desarrolladores a desarrollar los módulos adicionales para él. El depurador capta todas las solicitudes de Ajax y muestra todas las solicitudes de información (encabezado de respuesta, datos de respuesta, url, estado, etc.).Solo quiero agregar los encabezados de las solicitudes para tener una vista completa de la solicitud. Sé que es posible usar herramientas integradas de depuración del navegador, solo quiero ofrecer una herramienta personalizada. Por lo tanto, los encabezados de solicitud no pueden ser atrapados :( – Lwyrn

+0

¿Ha mirado la especificación w3c XMLHttpRequest? Http://www.w3.org/TR/2012/WD-XMLHttpRequest-20120117 Quizás podría ajustar el objeto XMLHttpRequest y luego capturar los encabezados tal como están siendo establecidos. Un poco incómodo. –

+1

Sí, parece que no es posible capturar los encabezados de solicitud – Lwyrn

1

algo que podría utilizar a es FakeXMLHttpRequest de Sinon para reemplazar XHR de su navegador. Se describe en this document sobre cómo usarlo para la prueba, pero estoy bastante seguro de que puede usar el módulo para su depuración.

Lo que hay que hacer es:

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

Y más tarde, se puede comprobar la matriz requests para los encabezados por:

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

Para acceder a las cabeceras de solicitud.

+0

Documentación oficial: http://sinonjs.org/docs/#server – uglymunky

Cuestiones relacionadas