Предполетный запрос не запущен для проверки CORS - PullRequest
0 голосов
/ 24 декабря 2018

Как я понимаю, запрос перед полетом отправляется браузером, если любое из следующих условий: false (источник: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests):

  • Метод запроса - GET, HEAD или POST.
  • Пользовательские заголовки не установлены.
  • Значением заголовка Content-Type является application/x-www-form-urlencoded, multipart/form-data или text/plain.

У меня есть веб-приложение, которое отправляет запрос GET на сервер с другим источником. Так как мне нужно отправлять куки на сервер, свойство withCredentials установлено на true. Заголовок Content-Type установлен на application/json. Для этого запроса браузер не запускает предполетный запрос, но он должен это делать, поскольку третье условие ложно. В чем может быть причина этого? Имеет ли это какое-либо отношение к незначительности заголовка Content-Typeдля запроса GET (поскольку тела запроса нет)?

РЕДАКТИРОВАТЬ: Добавление кода запроса:

configObject = {
  'withCredentials': true,
  headers: {
    'Content-Type': 'application/json'
  }
};

function getRequest(url, dict) {
  $http.get(url, Object.assign({}, configObject)).success(function(result) {
    // on success
  }).error(function(err) {
    // on error
  });
  // return
}

1 Ответ

0 голосов
/ 26 декабря 2018

Если ваш код внешнего интерфейса инициирует запрос кросс-источника и код, создающий запрос, на самом деле устанавливает заголовок Content-Type в application/json, то это обязательно заставит браузер выполнить предварительную проверку.Always.

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

Но конкретный случай, описанный в вопросе, является ... странным - потому что он пытается добавить заголовок Content-Type к запросу GET и запрос GET ввопрос (как и почти все другие GET запросы) не имеет тела запроса.

Итак, причина этого в том, что Angular для вызовов $http автоматически делает что-товозможно, довольно умный (если он неожиданный): при отсутствии тела запроса он удаляет заголовок Content-Type из запроса, что имеет некоторый смысл, потому что если тела запроса нет, нет необходимости иметь заголовок, указывающий еготип носителя.

См. принятый ответ на Угловой, тип контента не отправляется с $ http для подтверждения этого.

И поэтому, если по какой-то причине вам действительно нужно включить заголовок Content-Type в запрос, не имеющий тела запроса, то решение состоит либо в том, чтобы вообще не использовать $http в Angular, а вместо этого использовать, скажем,стандартный API Fetch, который позволит вам включить Content-Type даже для запросов, в которых отсутствует тело запроса - или иначе (в случае, если у вас также есть какое-то требование использовать $http Angular для передачи пустого тела запроса как частизапроса $http (добавив data: '' к запросу).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...