Come posso aggiungere un'intestazione HTTP personalizzata alla richiesta Ajax con js o jQuery?


Risposte:


585

Esistono diverse soluzioni a seconda di ciò di cui hai bisogno ...

Se vuoi aggiungere un'intestazione personalizzata (o un set di intestazioni) a una singola richiesta, aggiungi semplicemente la headersproprietà:

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

Se si desidera aggiungere un'intestazione predefinita (o un set di intestazioni) a ogni richiesta, utilizzare $.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' } });

Se vuoi aggiungere un'intestazione (o un set di intestazioni) a ogni richiesta, usa l' beforeSendhook con $.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' } });

Modifica (ulteriori informazioni): una cosa da tenere presente è che con ajaxSetupte puoi definire solo un set di intestazioni predefinite e puoi definirne solo uno beforeSend. Se si chiama ajaxSetuppiù volte, verrà inviato solo l'ultimo set di intestazioni e verrà eseguita solo l'ultima richiamata prima dell'invio .


Cosa succede se ne definisco uno nuovo beforeSendquando faccio un $.ajax?
Kostas,

3
È possibile definire solo un beforeSendcallback. Se si chiama $.ajaxSetup({ beforeSend: func... })due volte, il secondo callback sarà l'unico che si attiva.
Prestaul,

1
Aggiornato la mia risposta per aggiungere ulteriori dettagli in merito ajaxSetup.
Prestaul,

2
Sembra che non funzioni con la richiesta CORS (tutti i browser). C'è un lavoro in giro?
svassr,

1
@ Si8, mi sembra un problema interdominio. Non è possibile effettuare una richiesta da un dominio all'altro. Prova a cercare CORS e vedi se aiuta.
Prestaul,

54

Oppure, se si desidera inviare l'intestazione personalizzata per ogni richiesta futura, è possibile utilizzare quanto segue:

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

In questo modo ogni futura richiesta Ajax conterrà l'intestazione personalizzata, a meno che non sia esplicitamente sovrascritta dalle opzioni della richiesta. Puoi trovare maggiori informazioni ajaxSetup qui


1
Dove voglio davvero realizzare questo, questo non sembra funzionare davvero.
Viaggio

1
Bene, dovresti assicurarti che ajaxSetup sia chiamato prima dell'attuale chiamata ajax. Non conosco nessun altro motivo per cui questo non funzionerebbe :)
Szilard Muzsi il

20

Supponendo che JQuery ajax, puoi aggiungere intestazioni personalizzate come -

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

19

Ecco un esempio usando 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++;
}; 

Spero che aiuti.

Se si crea l'oggetto, è possibile utilizzare la funzione setRequestHeader per assegnare un nome e un valore prima di inviare la richiesta.


2
Anche se questo potrebbe essere stato corretto nel 2011, è generalmente una buona idea non reinventare la ruota e utilizzare invece una libreria AJAX come Zepto o jQuery.
Dan Dascalescu,

4
A meno che tu non stia provando ad aggiungere un'intestazione a una chiamata XHR2 esistente e non desideri iniziare a riscriverlo tutto per usare jQuery solo per quello ... A quel punto, @gryzzly ha l'unica risposta possibile.
roryhewitt,

@AliGajani Il problema è che alcune applicazioni o librerie (come THREE.js) non usano $.ajax*funzioni b / c, non dipendono da jQuery e invece usano XHR, quindi questa è l'unica opzione valida in quei casi.
Coburn,

1
@AliGajani Inoltre, non è solo il tempo di caricamento della rete ma il tempo di analisi della libreria. Inoltre, se non stai attento a quali dipendenze aggiungi, puoi ottenere rapidamente un progetto con troppe dipendenze
Oztaco - Reinstalla Monica C.

19

Puoi anche farlo senza usare jQuery. Sostituisci il metodo di invio XMLHttpRequest e aggiungi l'intestazione lì:

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;

12

Dovresti evitare l'uso di $.ajaxSetup()come descritto nei documenti . Utilizzare invece quanto segue:

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

6

Supponendo che intendi "Quando si utilizza ajax" e " Un'intestazione di richiesta HTTP ", utilizzare la headersproprietà nell'oggetto a cui si passaajax()

intestazioni (aggiunto 1.5)

Predefinito: {}

Una mappa di coppie chiave / valore dell'intestazione aggiuntive da inviare insieme alla richiesta. Questa impostazione è impostata prima che venga chiamata la funzione beforeSend; pertanto, qualsiasi valore nell'impostazione delle intestazioni può essere sovrascritto dalla funzione beforeSend.

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



1

Puoi usare js fetch

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.