Почему мой $.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 для предполета недействительно (перенаправление)
Ответы
Ответ 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 нуждаются в завершающих слэшах '/'.