Добавьте заголовок в запрос AJAX с помощью jQuery

Я хотел бы добавить пользовательский заголовок в запрос AJAX POST из jQuery.

Я пробовал это:

$.ajax({
    type: 'POST',
    url: url,
    headers: {
        "My-First-Header":"first value",
        "My-Second-Header":"second value"
    }
    //OR
    //beforeSend: function(xhr) { 
    //  xhr.setRequestHeader("My-First-Header", "first value"); 
    //  xhr.setRequestHeader("My-Second-Header", "second value"); 
    //}
}).done(function(data) { 
    alert(data);
});

Когда я отправляю этот запрос, и я смотрю с помощью FireBug, я вижу этот заголовок:

ОПЦИИ xxxx/yyyy HTTP/1.1
    Хост: 127.0.0.1:6666
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv: 11.0) Gecko/20100101 Firefox/11.0
    Accept: text/html, application/xhtml + xml, application/xml; q = 0.9,/; q = 0.8
    Accept-Language: fr, fr-fr; q = 0.8, en-us; q = 0.5, en; q = 0.3
    Accept-Encoding: gzip, deflate
    Соединение: keep-alive
    Происхождение: null
    Access-Control-Request-Method: POST
     Access-Control-Request-Headers: my-first-header, my-second-header
    Pragma: no-cache
    Cache-Control: no-cache

Почему мои пользовательские заголовки переходят на Access-Control-Request-Headers:

Access-Control-Request-Headers: my-first-header, my-second-header

Я ожидал такие значения заголовка, как это:

My-First-Header: первое значение
   My-Second-Header: второе значение

Возможно ли это?

Ответ 1

То, что вы видели в Firefox, не было фактическим запросом; обратите внимание, что HTTP-метод - OPTIONS, а не POST. Фактически это был "предполетный" запрос, который браузер делает, чтобы определить, должен ли разрешаться запрос на междоменный AJAX:

http://www.w3.org/TR/cors/

Заголовок заголовка Access-Control-Request-Headers в предполетном запросе включает список заголовков в фактическом запросе. Затем ожидается, что сервер сообщит, поддерживаются ли эти заголовки в этом контексте или нет, прежде чем браузер представит фактический запрос.

Ответ 2

Вот пример того, как установить заголовок запроса в JQuery Ajax Call:

$.ajax({
  type: "POST",
  beforeSend: function(request) {
    request.setRequestHeader("Authority", authorizationToken);
  },
  url: "entities",
  data: "json=" + escape(JSON.stringify(createRequestObject)),
  processData: false,
  success: function(msg) {
    $("#results").append("The result =" + StringifyPretty(msg));
  }
});

Ответ 3

Этот код ниже работает для меня. Я всегда использую только одинарные кавычки, и это прекрасно работает. Я предлагаю вам использовать только одинарные кавычки ИЛИ только двойные кавычки, но не путать.

$.ajax({
    url: 'YourRestEndPoint',
    headers: {
        'Authorization':'Basic xxxxxxxxxxxxx',
        'X-CSRF-TOKEN':'xxxxxxxxxxxxxxxxxxxx',
        'Content-Type':'application/json'
    },
    method: 'POST',
    dataType: 'json',
    data: YourData,
    success: function(data){
      console.log('succes: '+data);
    }
  });

Надеюсь, что это ответ на ваш вопрос...

Ответ 4

И именно поэтому вы не можете создать бота с Javascript, потому что ваши возможности ограничены тем, что позволяет вам делать браузер. Вы не можете просто заказать браузер, который следует политике CORS, которой придерживается большинство браузеров, для отправки случайных запросов другим источникам и получения простого ответа!

Кроме того, если вы попытались отредактировать некоторые заголовки запроса вручную, например origin-header из инструментов разработчика, которые поставляются с браузерами, браузер откажется от вашего редактирования и может отправить предварительный запрос OPTIONS.

Ответ 5

Поскольку вы отправляете пользовательские заголовки, поэтому ваш запрос CORS НЕ ПРОСТО ЗАПРОС, поэтому браузер сначала отправляет запрос ОПЦИИ предварительного просмотра, чтобы проверить, что сервер разрешает ваш запрос.

enter image description here

Если вы включите CORS на сервере, то ваш код будет работать. Вы также можете использовать js fetch (здесь)

let url='https://server.test-cors.org/server?enable=true&status=200&methods=POST&headers=My-First-Header,My-Second-Header';


$.ajax({
    type: 'POST',
    url: url,
    headers: {
        "My-First-Header":"first value",
        "My-Second-Header":"second value"
    }
}).done(function(data) { 
    alert(data[0].request.httpMethod + ' was send - open chrome console> network to see it');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Ответ 6

Попробуйте использовать rack-cors gem. И добавьте поле заголовка в ваш вызов ajax.