Js veya jQuery ile ajax isteğine nasıl özel bir HTTP üstbilgisi ekleyebilirim?


Yanıtlar:


585

İhtiyacınıza bağlı olarak çeşitli çözümler var ...

Tek bir isteğe özel bir üstbilgi (veya üstbilgi kümesi) eklemek istiyorsanız , headersözelliği eklemeniz yeterlidir:

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

Her isteğe varsayılan bir üstbilgi (veya üstbilgi kümesi) eklemek istiyorsanız şunu kullanın $.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' } });

Her isteğe bir üstbilgi (veya üstbilgi kümesi) eklemek istiyorsanız, aşağıdakileri içeren beforeSendkancayı kullanın $.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' } });

Düzenleme (daha fazla bilgi): Dikkat edilmesi gereken bir şey ajaxSetup, yalnızca bir varsayılan üstbilgi kümesi tanımlayabilmeniz ve yalnızca bir tanesini tanımlayabilmenizdir beforeSend. Birden ajaxSetupçok kez ararsanız , yalnızca son başlık kümesi gönderilir ve yalnızca son göndermeden önceki geri arama yürütülür.


beforeSendYaparken yeni bir tanım tanımlarsam ne olur $.ajax?
Kostas

3
Yalnızca bir beforeSendgeri arama tanımlayabilirsiniz . $.ajaxSetup({ beforeSend: func... })İki kez ararsanız , ikinci geri arama tetiklenir.
Prestaul

1
Hakkında daha fazla ayrıntı eklemek için cevabım güncellendi ajaxSetup.
Prestaul

2
Görünüşe göre CORS İsteği (her tarayıcı) ile çalışmaz. Etrafta bir çalışma var mı?
svassr

1
@ Si8, bu benim için alanlar arası bir sorun gibi görünüyor. Bir alandan diğerine istekte bulunamazsınız. CORS'a bakmayı deneyin ve bunun işe yarayıp yaramadığını görün.
Mart'ta Prestaul

54

Veya, gelecekteki her istek için özel üstbilgi göndermek istiyorsanız, aşağıdakileri kullanabilirsiniz:

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

Bu şekilde, gelecekteki her ajax isteği, isteğe bağlı seçenekler tarafından açıkça geçersiz kılınmadıkça özel üstbilgiyi içerir. Burada daha fazla bilgi bulabilirsinizajaxSetup


1
Bunu gerçekten başarmak istediğim yerde, bu aslında işe yaramıyor gibi görünüyor.
Yolculuk

1
Eh, ajaxSetup aracının gerçek ajax çağrısından önce çağrıldığından emin olmalısınız. Bunun işe yaramadığının başka bir nedeni bilmiyorum :)
Szilard Muzsi

20

JQuery ajax varsayarsak, aşağıdaki gibi özel başlıklar ekleyebilirsiniz -

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

19

İşte XHR2 kullanan bir örnek:

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++;
}; 

Umarım yardımcı olur.

Nesnenizi oluşturursanız, isteği göndermeden önce bir ad ve bir değer atamak için setRequestHeader işlevini kullanabilirsiniz.


2
Bu 2011'de doğru olsa da, tekerleği yeniden icat etmemek ve bunun yerine Zepto veya jQuery gibi bir AJAX kütüphanesi kullanmak iyi bir fikirdir.
Dan Dascalescu

4
Varolan bir XHR2 çağrısına bir başlık eklemeye çalışmıyorsanız ve sadece bunun için jQuery kullanmak için hepsini yeniden yazmaya başlamak istemiyorsanız ... Hangi noktada @gryzzly'nin tek geçerli yanıtı vardır.
14:41

@AliGajani Sorun, bazı uygulamaların veya kitaplıkların (THREE.js gibi) jQuery'ye $.ajax*bağımlı olmadıkları b / c işlevlerini kullanmaması ve bunun yerine XHR kullanmasıdır, bu nedenle bu durumlarda tek geçerli seçenektir.
Coburn

1
@AliGajani Ayrıca, yalnızca ağ yükleme zamanı değil, kitaplığın ayrıştırma zamanıdır. Ayrıca, hangi bağımlılıkları eklediğiniz konusunda dikkatli değilseniz, çok fazla bağımlılığa sahip bir projeyi hızlı bir şekilde alabilirsiniz
Oztaco - Reinstate Monica C.Kasım

19

Bunu jQuery kullanmadan da yapabilirsiniz. XMLHttpRequest'in gönderme yöntemini geçersiz kılın ve başlığı oraya ekleyin:

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

Dokümanlarda$.ajaxSetup() açıklandığı gibi kullanımından kaçınmalısınız . Bunun yerine aşağıdakileri kullanın:

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

6

"Ajax kullanırken" ve "HTTP İsteği üstbilgisi" demek istediğinizi varsayarsak, ilettiğiniz headersnesnede özelliği kullanınajax()

başlıklar (1.5 eklendi)

Varsayılan: {}

İstekle birlikte gönderilecek ek başlık anahtarı / değer çiftlerinin haritası. Bu ayar, beforeSend işlevi çağrılmadan önce yapılır; bu nedenle, üstbilgiler ayarındaki herhangi bir değerin beforeSend işlevi içinden yazılabilir.

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



1

Js fetch kullanabilirsiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.