Làm cách nào tôi có thể thêm tiêu đề HTTP tùy chỉnh vào yêu cầu ajax bằng js hoặc jQuery?


Câu trả lời:


585

Có một số giải pháp tùy thuộc vào những gì bạn cần ...

Nếu bạn muốn thêm một tiêu đề tùy chỉnh (hoặc bộ tiêu đề) vào một yêu cầu riêng lẻ thì chỉ cần thêm thuộc headerstính:

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

Nếu bạn muốn thêm một tiêu đề mặc định (hoặc bộ tiêu đề) cho mọi yêu cầu thì hãy sử dụng $.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' } });

Nếu bạn muốn thêm một tiêu đề (hoặc bộ tiêu đề) cho mọi yêu cầu thì hãy sử dụng beforeSendhook với $.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' } });

Chỉnh sửa (thông tin thêm): Một điều cần lưu ý là với ajaxSetupbạn chỉ có thể xác định một bộ tiêu đề mặc định và bạn chỉ có thể xác định một beforeSend. Nếu bạn gọi ajaxSetupnhiều lần, chỉ bộ tiêu đề cuối cùng sẽ được gửi và chỉ lần gọi lại trước khi gửi cuối cùng mới thực hiện.


Điều gì xảy ra nếu tôi xác định một cái mới beforeSendkhi làm một $.ajax?
Kostas

3
Bạn chỉ có thể xác định một beforeSendcuộc gọi lại. Nếu bạn gọi $.ajaxSetup({ beforeSend: func... })hai lần thì cuộc gọi lại thứ hai sẽ là cuộc gọi duy nhất kích hoạt.
Prestaul

1
Cập nhật câu trả lời của tôi để thêm chi tiết về ajaxSetup.
Prestaul

2
Có vẻ như nó không hoạt động với Yêu cầu CORS (mọi trình duyệt). Có một công việc xung quanh?
Svassr

1
@ Si8, có vẻ như là một vấn đề tên miền chéo đối với tôi. Bạn không thể thực hiện một yêu cầu từ tên miền này sang tên miền khác. Hãy thử nhìn vào CORS và xem nếu nó giúp.
Prestaul

54

Hoặc, nếu bạn muốn gửi tiêu đề tùy chỉnh cho mọi yêu cầu trong tương lai, thì bạn có thể sử dụng như sau:

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

Bằng cách này, mọi yêu cầu ajax trong tương lai sẽ chứa tiêu đề tùy chỉnh, trừ khi được ghi đè rõ ràng bởi các tùy chọn của yêu cầu. Bạn có thể tìm thêm thông tin ajaxSetup ở đây


1
Nơi tôi thực sự muốn thực hiện điều này, điều này dường như không thực sự hoạt động.
Chuyến đi

1
Chà, bạn nên chắc chắn rằng ajaxSetup được gọi trước cuộc gọi ajax thực tế. Tôi không biết lý do nào khác tại sao điều này sẽ không hoạt động :)
Szilard Muzsi

20

Giả sử ajax của JQuery, bạn có thể thêm các tiêu đề tùy chỉnh như -

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

19

Đây là một ví dụ sử dụng 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++;
}; 

Mong rằng sẽ giúp.

Nếu bạn tạo đối tượng của mình, bạn có thể sử dụng hàm setRequestHeader để gán tên và giá trị trước khi bạn gửi yêu cầu.


2
Mặc dù điều này có thể đúng vào năm 2011, nhưng nói chung, không nên phát minh lại bánh xe, và thay vào đó sử dụng thư viện AJAX như Zepto hoặc jQuery.
Dan Dascalescu

4
Trừ khi bạn đang cố thêm tiêu đề vào cuộc gọi XHR2 hiện có và không muốn bắt đầu viết lại tất cả để sử dụng jQuery chỉ vì điều đó ... Tại thời điểm đó, @gryzzly chỉ có câu trả lời khả thi.
roryhewitt

@AliGajani Vấn đề là một số ứng dụng hoặc thư viện nhất định (như THREE.js) không sử dụng các $.ajax*hàm b / c mà chúng không phụ thuộc vào jQuery và thay vào đó sử dụng XHR nên đây là tùy chọn hợp lệ duy nhất trong những trường hợp đó.
Coburn

1
@AliGajani Ngoài ra, đó không chỉ là thời gian tải mạng mà là thời gian phân tích cú pháp của thư viện. Ngoài ra, nếu bạn không cẩn thận với những phụ thuộc nào bạn thêm vào, bạn có thể nhanh chóng nhận được một dự án có quá nhiều phụ thuộc
Oztaco - Tái lập Monica C.

19

Bạn cũng có thể làm điều này mà không cần sử dụng jQuery. Ghi đè phương thức gửi của XMLHttpRequest và thêm tiêu đề vào đó:

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

Bạn nên tránh sử dụng $.ajaxSetup()như được mô tả trong các tài liệu . Sử dụng như sau thay thế:

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

6

Giả sử rằng bạn có nghĩa là "Khi sử dụng ajax" và " Tiêu đề yêu cầu HTTP ", sau đó sử dụng thuộc headerstính trong đối tượng bạn chuyển đếnajax()

tiêu đề (thêm 1,5)

Mặc định: {}

Một bản đồ của các cặp khóa / giá trị tiêu đề bổ sung để gửi cùng với yêu cầu. Cài đặt này được đặt trước khi hàm beforeSend được gọi; do đó, mọi giá trị trong cài đặt tiêu đề có thể được ghi đè từ bên trong hàm beforeSend.

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



1

Bạn có thể sử dụng js fetch

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.