Добавить заголовок в 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 / гггг HTTP / 1.1
Хост: 127.0.0.1:6666
Пользователь-агент: корпорация Mozilla/5.0 (окнах NT 6.1; WoW64 будет; как RV:11.0) движок Gecko/20100101 Firefox с/11.0
Принимать: текст / html, приложение / xhtml+xml, приложение / xml; q=0.9,/; q=0,8
Принять-язык: фр,фр-фр;м=0.8,en-США;г=0.5,Ан;д=0.3
Принять-кодировки: gzip-сжатия, выкачать
Соединение: keep-alive
Происхождение: null
Управление доступом-запрос-метод: POST
Access-Control-Request-Headers: мой-первый-заголовок, мой-второй-заголовок
Pragma: no-cache
Кэш-Контроль: нет-кэш

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

Access-Control-Request-Headers: мой-первый-заголовок, мой-второй-заголовок

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

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

это возможно?

5 ответов


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

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

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


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

$.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));
  }
});

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

$.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);
    }
  });

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


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

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


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