Comment puis-je ajouter un en-tête HTTP personnalisé à une demande ajax avec js ou jQuery?

Réponses:

585

Il existe plusieurs solutions en fonction de vos besoins ...

Si vous souhaitez ajouter un en-tête personnalisé (ou un ensemble d'en-têtes) à une demande individuelle, ajoutez simplement la headerspropriété:

// Request with custom header
$.ajax({
    url: 'foo/bar',
    headers: { 'x-my-custom-header': 'some value' }
});

Si vous souhaitez ajouter un en-tête par défaut (ou un ensemble d'en-têtes) à chaque demande, utilisez $.ajaxSetup():

$.ajaxSetup({
    headers: { 'x-my-custom-header': 'some value' }
});

// Sends your custom header
$.ajax({ url: 'foo/bar' });

// Overwrites the default header with a new header
$.ajax({ url: 'foo/bar', headers: { 'x-some-other-header': 'some value' } });

Si vous souhaitez ajouter un en-tête (ou un ensemble d'en-têtes) à chaque demande, utilisez le beforeSendhook avec $.ajaxSetup():

$.ajaxSetup({
    beforeSend: function(xhr) {
        xhr.setRequestHeader('x-my-custom-header', 'some value');
    }
});

// Sends your custom header
$.ajax({ url: 'foo/bar' });

// Sends both custom headers
$.ajax({ url: 'foo/bar', headers: { 'x-some-other-header': 'some value' } });

Modifier (plus d'informations): Une chose à savoir est qu'avec ajaxSetupvous, vous ne pouvez définir qu'un seul ensemble d'en-têtes par défaut et vous ne pouvez en définir qu'un beforeSend. Si vous appelez ajaxSetupplusieurs fois, seul le dernier ensemble d'en-têtes sera envoyé et seul le dernier rappel avant envoi sera exécuté.

Prestaul
la source
Que se passe-t-il si je définis un nouveau beforeSendlors de la réalisation d'un $.ajax?
Kostas
3
Vous ne pouvez définir qu'un seul beforeSendrappel. Si vous appelez $.ajaxSetup({ beforeSend: func... })deux fois, le deuxième rappel sera le seul à se déclencher.
Prestaul
1
Mis à jour ma réponse pour ajouter plus de détails sur ajaxSetup.
Prestaul
2
Il semble que cela ne fonctionne pas avec CORS Request (tous les navigateurs). Y at-il un travail autour ?
svassr
1
@ Si8, cela ressemble à un problème interdomaine pour moi. Vous ne pouvez pas faire de demande d'un domaine à un autre. Essayez de regarder dans CORS et voyez si cela aide.
Prestaul
54

Ou, si vous souhaitez envoyer l'en-tête personnalisé pour chaque demande future, vous pouvez utiliser ce qui suit:

$.ajaxSetup({
    headers: { "CustomHeader": "myValue" }
});

De cette façon, chaque future demande ajax contiendra l'en-tête personnalisé, à moins qu'elle ne soit explicitement remplacée par les options de la demande. Vous pouvez trouver plus d'informations ajaxSetup ici

Szilard Muzsi
la source
1
Là où je veux vraiment accomplir cela, cela ne semble pas vraiment fonctionner.
Voyage du
1
Eh bien, vous devez vous assurer que ajaxSetup est appelé avant l'appel ajax réel. Je ne connais aucune autre raison pour laquelle cela ne fonctionnerait pas :)
Szilard Muzsi
20

En supposant que JQuery ajax, vous pouvez ajouter des en-têtes personnalisés comme -

$.ajax({
  url: url,
  beforeSend: function(xhr) {
    xhr.setRequestHeader("custom_header", "value");
  },
  success: function(data) {
  }
});
Jayendra
la source
19

Voici un exemple d'utilisation de XHR2:

function xhrToSend(){
    // Attempt to creat the XHR2 object
    var xhr;
    try{
        xhr = new XMLHttpRequest();
    }catch (e){
        try{
            xhr = new XDomainRequest();
        } catch (e){
            try{
                xhr = new ActiveXObject('Msxml2.XMLHTTP');
            }catch (e){
                try{
                    xhr = new ActiveXObject('Microsoft.XMLHTTP');
                }catch (e){
                    statusField('\nYour browser is not' + 
                        ' compatible with XHR2');                           
                }
            }
        }
    }
    xhr.open('POST', 'startStopResume.aspx', true);
    xhr.setRequestHeader("chunk", numberOfBLObsSent + 1);
    xhr.onreadystatechange = function (e) {
        if (xhr.readyState == 4 && xhr.status == 200) {
            receivedChunks++;
        }
    };
    xhr.send(chunk);
    numberOfBLObsSent++;
}; 

J'espère que cela pourra aider.

Si vous créez votre objet, vous pouvez utiliser la fonction setRequestHeader pour attribuer un nom et une valeur avant d'envoyer la demande.

James
la source
2
Bien que cela ait pu être correct en 2011, c'est généralement une bonne idée de ne pas réinventer la roue, et d'utiliser à la place une bibliothèque AJAX comme Zepto ou jQuery.
Dan Dascalescu
4
Sauf si vous essayez d'ajouter un en-tête à un appel XHR2 existant et que vous ne voulez pas commencer à tout réécrire pour utiliser jQuery juste pour cela ... À ce stade, @gryzzly a la seule réponse viable.
roryhewitt
@AliGajani Le problème est que certaines applications ou bibliothèques (comme THREE.js) n'utilisent pas de $.ajax*fonctions b / c, elles ne dépendent pas de jQuery et utilisent plutôt XHR, c'est donc la seule option valable dans ces cas.
Coburn
1
@AliGajani De plus, ce n'est pas seulement le temps de chargement du réseau mais le temps d'analyse de la bibliothèque. De plus, si vous ne faites pas attention aux dépendances que vous ajoutez, vous pouvez rapidement obtenir un projet avec trop de dépendances
Oztaco - Reinstate Monica C.
19

Vous pouvez également le faire sans utiliser jQuery. Remplacez la méthode d'envoi de XMLHttpRequest et ajoutez-y l'en-tête:

XMLHttpRequest.prototype.realSend = XMLHttpRequest.prototype.send;
var newSend = function(vData) {
    this.setRequestHeader('x-my-custom-header', 'some value');
    this.realSend(vData);
};
XMLHttpRequest.prototype.send = newSend;
Roland T.
la source
12

Vous devez éviter l'utilisation de $.ajaxSetup()comme décrit dans la documentation . Utilisez plutôt ce qui suit:

$(document).ajaxSend(function(event, jqXHR, ajaxOptions) {
    jqXHR.setRequestHeader('my-custom-header', 'my-value');
});
Stefan D.
la source
6

En supposant que vous voulez dire «lors de l'utilisation d'ajax» et «un en- tête de requête HTTP », utilisez ensuite la headerspropriété de l'objet vers lequel vous passezajax()

en-têtes (ajouté 1.5)

Défaut: {}

Une carte des paires clé / valeur d'en-tête supplémentaires à envoyer avec la demande. Ce paramètre est défini avant l'appel de la fonction beforeSend; par conséquent, toutes les valeurs du paramètre d'en-têtes peuvent être remplacées à partir de la fonction beforeSend.

- http://api.jquery.com/jQuery.ajax/

Quentin
la source
1

Vous pouvez utiliser js fetch

Kamil Kiełczewski
la source