Подтвердить что ты не робот

Почему мой $.ajax показывает, что "предполетная ошибка - неверная ошибка переадресации"?

Я пробовал следующий код в Postman, и он работал. Что-то не так с кодом?

$.ajax({
   url: 'http://api.example.com/users/get',
   type: 'POST',
   headers: {
      'name-api-key':'ewf45r4435trge',
   },
   data: {
      'uid':36,
   },
   success: function(data) {
      console.log(data);
   }
});

Я получил эту ошибку в консоли, как показано ниже, пожалуйста, сообщите нам.

XMLHttpRequest не может загрузить http://api.example.com/users/get Response для предполета недействительно (перенаправление)

4b9b3361

Ответ 1

Я получил ту же ошибку, когда попытался вызвать веб-службу https как http webservice.

e.g when I call url 'http://api.example.com/users/get'
which should be 'https://api.example.com/users/get'

Эта ошибка возникает из-за статуса перенаправления 302 при попытке вызвать http вместо https.

Ответ 2

Этот ответ охватывает ту же самую вещь (хотя для angular) - это проблема CORS.

Одним быстрым решением является изменение каждого запроса POST, указав один из значений заголовка 'Content-Type', который не вызовет "предполетный". Эти типы:

  • применение/х-WWW-форм-urlencoded
  • многочастному/форм-данных
  • Текст/равнина

НИЧЕГО ELSE запускает предполетную запись.

Например:

$.ajax({
   url: 'http://api.example.com/users/get',
   type: 'POST',
   headers: {
      'name-api-key':'ewf45r4435trge',
      'Content-Type':'application/x-www-form-urlencoded'
   },
   data: {
      'uid':36,
   },
   success: function(data) {
      console.log(data);
   }
});

Ответ 3

Укажите заголовок http-содержимого в заголовке, а также убедитесь, что сервер аутентифицирует CORS. Вот как это делается в PHP:

//NOT A TESTED CODE
header('Content-Type: application/json;charset=UTF-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: DELETE, HEAD, GET, OPTIONS, POST, PUT');
header('Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description');
header('Access-Control-Max-Age: 1728000');

Обратитесь к:

http://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0

Как работает заголовок Access-Control-Allow-Origin?

Ответ 4

Ошибка указывает, что предполетный режим получает ответ перенаправления. Это может произойти по ряду причин. Узнайте, куда вы перенаправляетесь, чтобы узнать, почему это происходит. Проверьте вкладку сети в Инструментах разработчика.

Одна из причин, по словам @Peter T, заключается в том, что API, скорее всего, требует HTTPS-соединений, а не HTTP, и все запросы по HTTP перенаправляются. Заголовок Location, возвращаемый ответом 302, в этом случае сказал бы тот же url с http, который был изменен на https.

Другая причина может заключаться в том, что ваш токен аутентификации не отправляется или неверен. Большинство серверов настроены на перенаправление всех запросов, которые не включают токен аутентификации на страницу входа. Опять же, проверьте заголовок Location, чтобы узнать, отправляется ли это сообщение, и также посмотрите, чтобы браузер отправил ваш токен аутентификации с запросом.

Зачастую сервер будет настроен так, чтобы всегда перенаправлять запросы, у которых нет токенов аутентификации на странице входа, включая запросы preflight/ OPTIONS. Это проблема. Измените конфигурацию сервера, чтобы разрешить OPTIONS запросы от пользователей, не прошедших проверку подлинности.

Ответ 5

У меня была такая же ошибка, хотя проблема заключалась в том, что у меня была опечатка в URL-адресе

url: 'http://api.example.com/TYPO'

API имел перенаправление на другой домен для всех неправильных URL (404 ошибки).

Так что исправление опечатки с правильным URL-адресом исправило это для меня.

Ответ 6

Моя проблема заключалась в том, что запросы POST нуждаются в завершающих слэшах '/'.