web-dev-qa-db-fra.com

JS / jQuery obtient les en-têtes de demande HTTPRequest?

L'utilisation de getAllResponseHeaders dans l'objet xhr, est possible d'obtenir tous les en-têtes de réponse après un appel ajax. Mais je ne trouve pas de moyen d'obtenir la chaîne d'en-têtes Request, est-ce possible?

23
Lwyrn

Si c'est à des fins de débogage, vous pouvez simplement utiliser Firebug ou Chrome Developer Tools (et quelle que soit la fonction appelée dans IE) pour examiner le trafic réseau de votre navigateur vers le serveur.

Une alternative serait d'utiliser quelque chose comme ce script:

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

Cependant, je pense que seuls les en-têtes déjà définis dans headers sont disponibles (je ne sais pas ce qui se passe si les en-têtes sont modifiés (par exemple dans beforeSend).

Vous pouvez lire un peu plus sur jQuery ajax à: http://api.jquery.com/jQuery.ajax/

EDIT: Si vous voulez simplement attraper les en-têtes de tous les appels à setRequestHeader sur XMLHttpRequest, vous pouvez simplement encapsuler cette méthode. C'est un peu un hack et bien sûr, vous devez vous assurer que le code d'encapsulation des fonctions ci-dessous est exécuté avant que l'une des demandes n'ait lieu.

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

Maintenant, une fois les en-têtes définis sur une instance XMLHttpRequest, nous pouvons les extraire en examinant xhr.headers par exemple.

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

Vous pourriez utiliser FakeXMLHttpRequest de Sinon pour remplacer le XHR de votre navigateur. Il est décrit dans ce document sur la façon de l'utiliser pour les tests, mais je suis sûr que vous pouvez utiliser le module à des fins de débogage.

Ce que vous devez faire, c'est:

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

Et plus tard, vous pouvez vérifier votre tableau requests pour les en-têtes en:

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

Pour accéder à vos en-têtes de demande.

1
Reza S