Я сделал небольшой асинхронный запрос GET на мой сервер с vanilla js.

var rReq = new XMLHttpRequest();
      rReq.onload = function (e) {
          window.updateCartnRows(e.target.response);
      };
      rReq.open('GET', '/usr/cart/xhrRemoveItemsByType/' + type, true);     
      rReq.responseType = 'text';
      rReq.send();

С точки зрения клиента, он работает как положено, но мой сервер не рассматривает его как асинхронный запрос, он не проходит проверку xhr, если я его установил.

Запрос Equal Jquery работает нормально:

 $.get('/usr/cart/xhrRemoveItemsByType/' + type, function (e) {
      console.log(e);
      window.updateCartnRows(e);
  });

Разница в X-Requested-With "XMLHttpRequest" HTTP-заголовок, который был установлен по умолчанию в запросе Jquery. Я обнаружил, что запрос vanilla js можно исправить с помощью этой строки:

rReq.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

Но я сомневаюсь в этом решении, как в документации (например, MDN) ничего не упоминалось о необходимости установки этого заголовка, просто истинный параметр async в методе XMLHttpRequest.open ().

0
Vsevolod 8 Дек 2016 в 15:09

3 ответа

Лучший ответ

Во-первых, вы объединяете несвязанные вещи: независимо от того, является ли запрос асинхронным и происходит ли запрос от объекта XMLHttpRequest, не имеют ничего общего друг с другом.

Ничто в XMLHttpRequest спецификации не говорит о необходимости устанавливать этот заголовок. Исторически некоторые реализации устанавливали его, но это не то, что было стандартизировано.

Исходный код jQuery включает в себя явную настройку этого заголовка (за исключением перекрестных запросов), поэтому вы видите его в запросе, выполненном через оболочку jQuery XHR.

Если вы хотите, чтобы в запросе был заголовок, просто используйте код, который вы включили в свой вопрос, чтобы добавить его с setRequestHeader перед вызовом send.

1
T.J. Crowder 8 Дек 2016 в 12:26

Настройка заголовка - это специфическая для jQuery вещь, см. https: / /github.com/jquery/jquery/blob/master/src/ajax/xhr.js#L59

Подробнее о причинах этого можно прочитать на странице В чем суть заголовка X-Requested-With?

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

1
ebi 8 Дек 2016 в 12:20

XMLHttpRequest - это просто http клиент для отправки http запроса. В протоколе http нет async/sync. Это просто вид в браузере.

1
acrazing 8 Дек 2016 в 12:17