Як я можу додати користувальницький заголовок HTTP до запиту ajax за допомогою js або jQuery?


Відповіді:


585

Є кілька рішень залежно від того, що вам потрібно ...

Якщо ви хочете додати спеціальний заголовок (або набір заголовків) до індивідуального запиту, просто додайте headersвластивість:

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

Якщо ви хочете додати заголовок за замовчуванням (або набір заголовків) до кожного запиту, використовуйте $.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' } });

Якщо ви хочете додати заголовок (або набір заголовків) до кожного запиту, використовуйте beforeSendгачок із $.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' } });

Редагування (додаткова інформація): Одне, що слід пам’ятати, - це те, що ajaxSetupви можете визначити лише один набір заголовків за замовчуванням, а ви можете визначити лише один beforeSend. Якщо ви зателефонували ajaxSetupкілька разів, буде надісланий лише останній набір заголовків, і буде виконано лише останній зворотний виклик перед відправленням.


Що станеться, якщо я визначаю нове beforeSendпід час виконання $.ajax?
Костас

3
Ви можете визначити лише один beforeSendзворотний дзвінок. Якщо ви дзвоните $.ajaxSetup({ beforeSend: func... })двічі, то другий зворотний виклик буде єдиним, хто спрацьовує.
Prestaul

1
Оновив мою відповідь, щоб додати більше інформації про ajaxSetup.
Prestaul

2
Схоже, це не працює з CORS Request (кожен браузер). Чи є робота навколо?
svassr

1
@ Si8, це схоже на проблему перехресного домену. Ви не можете робити запит від одного домену до іншого. Спробуйте заглянути в CORS і побачити, чи це допомагає.
Prestaul

54

Або, якщо ви хочете надіслати спеціальний заголовок для кожного майбутнього запиту, ви можете скористатись наступним:

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

Таким чином, кожен майбутній запит ajax буде містити користувальницький заголовок, якщо явно не перекрито параметри запиту. Більше інформації можна знайти ajaxSetup тут


1
Де я справді хочу цього досягти, це, здається, насправді не працює.
Поїздка

1
Ну ви повинні переконатися, що ajaxSetup викликається перед фактичним викликом ajax. Я не знаю жодної іншої причини, чому це не вийшло б)
Szilard Muzsi

20

Якщо припустити JQuery ajax, ви можете додати спеціальні заголовки, наприклад -

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

19

Ось приклад використання 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++;
}; 

Сподіваюся, що це допомагає.

Якщо ви створюєте свій об'єкт, ви можете використовувати функцію setRequestHeader, щоб призначити ім'я та значення, перш ніж надсилати запит.


2
Незважаючи на те, що це було правильним у 2011 році, загалом, це гарна ідея не винаходити колесо, а замість цього використовувати бібліотеку AJAX на зразок Zepto або jQuery.
Дан Даскалеску

4
Якщо ви не намагаєтеся додати заголовок до існуючого виклику XHR2 і не хочете починати переписувати все, щоб використовувати jQuery саме для цього ... На цей момент у @gryzzly є єдиний життєздатний відповідь.
roryhewitt

@AliGajani Проблема полягає в тому, що деякі програми або бібліотеки (наприклад, THREE.js) не використовують $.ajax*функції b / c, вони не залежать від jQuery, а замість цього використовують XHR, тому це єдиний вірний варіант у цих випадках.
Coburn

1
@AliGajani Крім того, це не просто час завантаження мережі, а час розбору бібліотеки. Плюс, якщо ви не обережні, які залежності ви додаєте, ви можете швидко отримати проект із занадто великою кількістю залежностей
Oztaco - Відновіть Моніку C.

19

Ви також можете це зробити, не використовуючи jQuery. Замініть метод відправлення XMLHttpRequest і додайте туди заголовок:

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

Вам слід уникати використання, $.ajaxSetup()як описано в документах . Замість цього використовуйте наступне:

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

6

Якщо припустити, що ви маєте на увазі "Під час використання ajax" та " Заголовок HTTP Request ", то використовуйте headersвластивість в об'єкті, якому ви передаєтеajax()

заголовки (додано 1,5)

За замовчуванням: {}

Карта додаткових пар заголовків / значень, що надсилаються разом із запитом. Цей параметр встановлюється до виклику функції beforeSend; тому будь-які значення в налаштуваннях заголовків можуть бути перезаписані в межах функції beforeSend.

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



1

Ви можете використовувати js fetch

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.