Примечание для мода : Этот вопрос о том, почему Postman не подчиняется ограничениям CORS так же, как XMLHttpRequest. Этот вопрос не о том, как исправить ошибку "Нет 'Access-Control-Allow-Origin' ...".
Пожалуйста, прекратите публикацию :
- Конфигурации CORS для каждого языка / фреймворка под солнцем. Вместо этого найдите вопрос вашего языка / основы .
- Сторонние сервисы, позволяющие обойти запрос CORS
- Параметры командной строки для отключения CORS для различных браузеров
Я пытаюсь выполнить авторизацию с помощью JavaScript , подключившись к RESTful API, встроенному в Flask . Однако, когда я делаю запрос, я получаю следующую ошибку:
XMLHttpRequest не может загрузить http: // myApiUrl / login . В запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Происхождение 'null', следовательно, не разрешено.
Я знаю, что API или удаленный ресурс должен устанавливать заголовок, но почему он работал, когда я делал запрос через расширение Chrome Postman ?
Это код запроса:
$.ajax({
type: "POST",
dataType: 'text',
url: api,
username: 'user',
password: 'pass',
crossDomain : true,
xhrFields: {
withCredentials: true
}
})
.done(function( data ) {
console.log("done");
})
.fail( function(xhr, textStatus, errorThrown) {
alert(xhr.responseText);
alert(textStatus);
});
javascript
jquery
cors
same-origin-policy
flask-restless
Мистер джедай
источник
источник
Ответы:
Если я правильно понял, вы делаете запрос XMLHttpRequest в другой домен, чем ваша страница. Поэтому браузер блокирует его, так как он обычно позволяет запрос в том же источнике по соображениям безопасности. Вам нужно сделать что-то другое, когда вы хотите сделать междоменный запрос. Учебник о том, как этого добиться, использует CORS .
Когда вы используете почтальон, они не ограничены этой политикой. Цитируется из перекрестного источника XMLHttpRequest :
источник
Это очень просто решить, если вы используете PHP . Просто добавьте следующий скрипт в начало вашей PHP-страницы, которая обрабатывает запрос:
Если вы используете Node-red, вы должны разрешить CORS в
node-red/settings.js
файле, не комментируя следующие строки:Если вы используете Flask так же, как вопрос; Вы должны сначала установить
flask-cors
Затем включите флаконы в ваше приложение.
Простое приложение будет выглядеть так:
Для более подробной информации, вы можете проверить документацию Flask .
источник
Потому что
$ .ajax ({type: "POST" - вызывает OPTIONS
$ .post ( - вызывает POST
Оба разные. Почтальон правильно называет «POST», но когда мы его называем, это будут «OPTIONS».
Для веб-сервисов C # - веб-API
Добавьте следующий код в файл web.config под тегом <system.webServer>. Это будет работать:
Пожалуйста, убедитесь, что вы не делаете никакой ошибки в вызове Ajax
JQuery
Примечание: Если вы ищете для загрузки контента с веб - сайта третьей стороной , то это не поможет . Вы можете попробовать следующий код, но не JavaScript.
источник
*
использованияhttps://www.myotherdomain.com
Применение ограничения CORS - это функция безопасности, определяемая сервером и реализуемая браузером .
Однако инструмент Postman не заботится о политике CORS сервера.
Вот почему ошибка CORS появляется в браузере, а не в Почтальоне.
источник
В приведенном ниже исследовании в качестве API я использую http://example.com вместо http: // myApiUrl / login из вашего вопроса, потому что этот первый работает.
Я предполагаю, что ваша страница находится на http: //my-site.local: 8088 .
Причина, по которой вы видите разные результаты, заключается в том, что почтальон:
Host=example.com
(ваш API)Origin
Это похоже на способ отправки запросов браузерами, когда сайт и API имеют одинаковый домен (браузеры также устанавливают элемент заголовка
Referer=http://my-site.local:8088
, однако я не вижу его в Postman). КогдаOrigin
заголовок не установлен, обычно серверы разрешают такие запросы по умолчанию.Это стандартный способ отправки запросов почтальоном. Но браузер отправляет запросы по-разному, когда ваш сайт и API имеют разные домены , а затем происходит CORS и браузер автоматически:
Host=example.com
(ваш как API)Origin=http://my-site.local:8088
(ваш сайт)(Заголовок
Referer
имеет то же значение, что иOrigin
). Теперь на вкладке « Консоль и сети » Chrome вы увидите:Когда у вас есть
Host != Origin
это CORS, и когда сервер обнаруживает такой запрос, он обычно блокирует его по умолчанию .Origin=null
устанавливается при открытии содержимого HTML из локального каталога и отправке запроса. Такая же ситуация возникает, когда вы отправляете запрос внутри<iframe>
, как в следующем фрагменте кода (но здесьHost
заголовок вообще не задан) - в общем, везде, где спецификация HTML говорит о непрозрачном происхождении, вы можете перевести это вOrigin=null
. Более подробную информацию об этом вы можете найти здесь .Если вы не используете простой запрос CORS, обычно браузер автоматически также отправляет запрос OPTIONS перед отправкой основного запроса - дополнительная информация здесь . Фрагмент ниже показывает это:
Вы можете изменить конфигурацию вашего сервера, чтобы разрешать запросы CORS.
Вот пример конфигурации, которая включает CORS для nginx (файл nginx.conf) - будьте очень осторожны с настройками
always/"$http_origin"
для nginx и"*"
для Apache - это разблокирует CORS из любого домена.Показать фрагмент кода
Вот пример конфигурации, которая включает CORS на Apache (файл .htaccess)
Показать фрагмент кода
источник
Обнаружена одна и та же ошибка в другом случае использования.
Вариант использования: в chrome при попытке вызвать конечную точку Spring REST в угловом формате.
Решение: Добавьте аннотацию @CrossOrigin ("*") поверх соответствующего класса контроллера.
источник
Если вы используете .NET в качестве среднего уровня, четко проверьте атрибут маршрута, например,
У меня была проблема, когда это было так,
Исправлено этим,
источник
Только для проекта .NET Core Web API добавьте следующие изменения:
services.AddMvc()
строки вConfigureServices()
методе файла Startup.cs:app.UseMvc()
строки вConfigure()
метод файла Startup.cs:источник