Я пытаюсь настроить AngularJS для связи с ресурсом из разных источников, где узел ресурсов, который доставляет мои файлы шаблонов, находится в другом домене, и поэтому запрос XHR, который выполняет angular, должен быть междоменным. Я добавил соответствующий заголовок CORS на свой сервер для HTTP-запроса, чтобы он работал, но, похоже, он не работает. Проблема в том, что когда я проверяю HTTP-запросы в моем браузере (chrome), запрос, отправленный в файл ресурса, является запросом OPTIONS (это должен быть запрос GET).
Я не уверен, является ли это ошибкой в AngularJS или мне нужно что-то настроить. Из того, что я понимаю, оболочка XHR не может сделать HTTP-запрос OPTIONS, поэтому похоже, что браузер пытается выяснить, «разрешено» ли загружать ресурс, прежде чем он выполнит запрос GET. Если это так, то мне нужно также установить заголовок CORS (Access-Control-Allow-Origin: http://asset.host ... ) С хостом ресурса?
$resource
POST генерирует запрос OPTIONS для моего внутреннего сервера ExpressJS (на том же хосте, но на другом порту).Для Angular 1.2.0rc1 + вам нужно добавить resourceUrlWhitelist.
1.2: в выпускной версии добавлена функция escapeForRegexp, поэтому вам больше не нужно экранировать строки. Вы можете просто добавить URL-адрес напрямую
не забудьте добавить ** для подпапок. Вот рабочий jsbin для 1.2: http://jsbin.com/olavok/145/edit
1.2.0rc: Если вы все еще используете версию rc, решение Angular 1.2.0rc1 выглядит следующим образом:
Вот пример jsbin, где он работает для 1.2.0rc1: http://jsbin.com/olavok/144/edit
До 1.2: Для более старых версий (ref http://better-inter.net/enabling-cors-in-angular-js/ ) вам необходимо добавить следующие 2 строки в вашу конфигурацию:
Вот пример jsbin, где он работает для версий до 1.2: http://jsbin.com/olavok/11/edit
источник
НОТА: Не уверен, что он работает с последней версией Angular.
ОРИГИНАЛ:
Также возможно переопределить запрос OPTIONS (был протестирован только в Chrome):
источник
$resource('http://yourserver/yourentity/:id', {}, {query: {method: 'GET'});
Ваш сервис должен ответить на
OPTIONS
запрос с такими заголовками:Вот хороший документ: http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server
источник
В том же документе говорится
В отличие от простых запросов (обсужденных выше), «предварительно выданные» запросы сначала отправляют заголовок запроса HTTP OPTIONS ресурсу в другом домене, чтобы определить, является ли фактический запрос безопасным для отправки. Межсайтовые запросы предварительно просматриваются следующим образом, поскольку они могут иметь значение для пользовательских данных. В частности, запрос предварительно просвечивается, если:
Когда исходным запросом является Get без пользовательских заголовков, браузер не должен делать запрос Options, который он делает сейчас. Проблема в том, что он генерирует заголовок X-Requested-With, который форсирует запрос параметров. См. Https://github.com/angular/angular.js/pull/1454 как удалить этот заголовок.
источник
Это исправило мою проблему:
источник
Если вы используете сервер nodeJS, вы можете использовать эту библиотеку, у меня она работала нормально https://github.com/expressjs/cors
и после того, как вы можете сделать
npm update
.источник
Вот как я исправил эту проблему в ASP.NET
Во-первых, вы должны добавить пакет nuget Microsoft.AspNet.WebApi.Cors
Затем измените файл App_Start \ WebApiConfig.cs
Добавьте этот атрибут в свой класс контроллера
Я был в состоянии отправить JSON к действию таким образом
Ссылка: Включение перекрестных запросов в ASP.NET Web API 2
источник
Каким-то образом я исправил это, изменив
в
источник
Отлично описано в комментарии пкозловского. У меня было рабочее решение с AngularJS 1.2.6 и ASP.NET Web Api, но когда я обновил AngularJS до 1.3.3, запросы не выполнялись.
Решение для сервера Web Api заключалось в том, чтобы добавить обработку запросов OPTIONS в начале метода настройки (подробнее в этом посте ):
источник
Если вы используете Джерси для REST API, вы можете сделать, как показано ниже
Вам не нужно менять реализацию веб-сервисов.
Я объясню для Джерси 2.x
1) Сначала добавьте ResponseFilter, как показано ниже
2) затем в файле web.xml в объявлении сервлета джерси добавьте
источник
Я бросил пытаться решить эту проблему.
В моем IIS web.config имелось соответствующее «
Access-Control-Allow-Methods
», я экспериментировал с добавлением параметров конфигурации в мой код Angular, но после нескольких часов попыток заставить Chrome вызывать междоменный веб-сервис JSON, я с треском отказался.В конце концов, я добавил тупую веб-страницу обработчика ASP.Net, получил ее , чтобы вызвать мой веб-сервис JSON и вернуть результаты. Все было готово через 2 минуты.
Вот код, который я использовал:
И в моем угловом контроллере ...
Я уверен, что есть более простой / более общий способ сделать это, но жизнь слишком коротка ...
Это сработало для меня, и теперь я могу заниматься нормальной работой !!
источник
Для проекта IIS MVC 5 / Angular CLI (да, я хорошо знаю, что ваша проблема связана с Angular JS) с API, я сделал следующее:
web.config под
<system.webServer>
узломGlobal.asax.cs
Это должно исправить ваши проблемы как для MVC, так и для WebAPI без необходимости делать все остальные обходы. Затем я создал HttpInterceptor в проекте Angular CLI, который автоматически добавил в соответствующую информацию заголовка. Надеюсь, это поможет кому-то в подобной ситуации.
источник
Немного опоздал на вечеринку,
Если вы используете Angular 7 (или 5/6/7) и PHP в качестве API и по-прежнему получаете эту ошибку, попробуйте добавить следующие параметры заголовка в конечную точку (PHP API).
Примечание : Что требуется только это
Access-Control-Allow-Methods
. Но я вставлю здесь два других,Access-Control-Allow-Origin
иAccess-Control-Allow-Headers
просто потому, что вам нужно, чтобы все они были правильно установлены, чтобы Angular App правильно взаимодействовал с вашим API.Надеюсь, это кому-нибудь поможет.
Приветствия.
источник