Usiłuję skonfigurować AngularJS do komunikowania się z zasobem pochodzącym z różnych źródeł, gdzie host zasobów, który dostarcza moje pliki szablonów, znajduje się w innej domenie, a zatem żądanie XHR, które wykonuje angular, musi być między domenami. Dodałem odpowiedni nagłówek CORS do mojego serwera dla żądania HTTP, aby to działało, ale wydaje się, że nie działa. Problem polega na tym, że kiedy sprawdzam żądania HTTP w mojej przeglądarce (chrome), żądanie wysłane do pliku zasobu jest żądaniem OPTIONS (powinno to być żądanie GET).
Nie jestem pewien, czy jest to błąd w AngularJS, czy też muszę coś skonfigurować. Z tego, co rozumiem, opakowanie XHR nie może wykonać OPCJI żądania HTTP, więc wygląda na to, że przeglądarka próbuje ustalić, czy „najpierw” można pobrać zasób, zanim wykona żądanie GET. Jeśli tak jest, to czy muszę ustawić nagłówek CORS (Access-Control-Allow-Origin: http://asset.host ... ) Również z hostem zasobów?
źródło
$resource
POST AngularJS generuje żądanie OPCJE do mojego serwera ExpressJS zaplecza (na tym samym hoście, ale innym porcie).W przypadku Angulara 1.2.0rc1 + musisz dodać zasóbUrlWhitelist.
1.2: wersja wydania dodali funkcję escapeForRegexp, więc nie musisz już uciekać od łańcuchów. Możesz po prostu dodać adres URL bezpośrednio
pamiętaj, aby dodać ** do podfolderów. Oto działający jsbin dla 1.2: http://jsbin.com/olavok/145/edit
1.2.0rc: Jeśli nadal jesteś w wersji rc, Angular 1.2.0rc1 rozwiązanie wygląda następująco:
Oto przykład jsbin, w którym działa dla 1.2.0rc1: http://jsbin.com/olavok/144/edit
Pre 1.2: W przypadku starszych wersji (zob. Http://better-inter.net/enabling-cors-in-angular-js/ ) musisz dodać do konfiguracji następujące 2 wiersze:
Oto przykład jsbin, w którym działa on dla wersji wcześniejszych niż 1.2: http://jsbin.com/olavok/11/edit
źródło
UWAGA: Nie jestem pewien, czy działa z najnowszą wersją Angular.
ORYGINALNY:
Możliwe jest również zastąpienie żądania OPCJE (przetestowane tylko w Chrome):
źródło
$resource('http://yourserver/yourentity/:id', {}, {query: {method: 'GET'});
Twoja usługa musi odpowiedzieć na
OPTIONS
żądanie za pomocą takich nagłówków:Oto dobry dokument: http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server
źródło
Ten sam dokument mówi
W przeciwieństwie do prostych żądań (omówionych powyżej), wnioski „wstępnie sprawdzone” najpierw wysyłają nagłówek żądania OPCJE HTTP do zasobu w innej domenie, w celu ustalenia, czy faktyczne żądanie jest bezpieczne do wysłania. Żądania między witrynami są wstępnie sprawdzane w ten sposób, ponieważ mogą mieć wpływ na dane użytkownika. W szczególności żądanie jest wstępnie sprawdzane, jeśli:
Gdy pierwotnym żądaniem jest Uzyskaj bez niestandardowych nagłówków, przeglądarka nie powinna wysyłać żądania Opcji, co robi teraz. Problem polega na tym, że generuje nagłówek X-Requested-With, który wymusza żądanie opcji. Zobacz https://github.com/angular/angular.js/pull/1454, jak usunąć ten nagłówek
źródło
To naprawiło mój problem:
źródło
Jeśli korzystasz z serwera nodeJS, możesz użyć tej biblioteki, działało to dobrze dla mnie https://github.com/expressjs/cors
i kiedy możesz zrobić
npm update
.źródło
Oto sposób, w jaki rozwiązałem ten problem na ASP.NET
Najpierw należy dodać pakiet nuget Microsoft.AspNet.WebApi.Cors
Następnie zmodyfikuj plik App_Start \ WebApiConfig.cs
Dodaj ten atrybut do swojej klasy kontrolera
W ten sposób mogłem wysłać Jsona na akcję
Odwołanie: Włączanie żądań krzyżowania pochodzenia w ASP.NET Web API 2
źródło
Jakoś to naprawiłem, zmieniając
do
źródło
Idealnie opisane w komentarzu pkozłowskiego. Miałem działające rozwiązanie z AngularJS 1.2.6 i ASP.NET Web Api, ale kiedy uaktualniłem AngularJS do 1.3.3, żądania nie powiodły się.
Rozwiązaniem dla serwera Web Api było dodanie obsługi żądań OPTIONS na początku metody konfiguracji (więcej informacji w tym poście na blogu ):
źródło
Jeśli używasz Jersey dla interfejsów API REST, możesz wykonać następujące czynności
Nie musisz zmieniać implementacji usług sieciowych.
Wyjaśnię dla Jersey 2.x
1) Najpierw dodaj filtr odpowiedzi, jak pokazano poniżej
2) następnie w pliku web.xml, w deklaracji serwletu jersey dodaj poniżej
źródło
Zrezygnowałem z próby rozwiązania tego problemu.
Mój web.config IIS miał odpowiedni „
Access-Control-Allow-Methods
”, eksperymentowałem z dodawaniem ustawień konfiguracji do mojego kodu Angular, ale po spaleniu kilku godzin, próbując przekonać Chrome do wywołania usługi internetowej JSON między domenami, zrezygnowałem.Na koniec dodałem głupią stronę obsługi ASP.Net, mam to zadzwonić do mojego serwisu WWW JSON, i zwróci wyniki. Uruchomiono go w 2 minuty.
Oto kod, którego użyłem:
I w moim kontrolerze Angular ...
Jestem pewien, że istnieje prostszy / bardziej ogólny sposób, ale życie jest za krótkie ...
To działało dla mnie i mogę teraz zacząć normalną pracę !!
źródło
W przypadku projektu IIS MVC 5 / Angular CLI (Tak, dobrze wiem, że twój problem dotyczy Angular JS) z interfejsem API, wykonałem następujące czynności:
web.config w
<system.webServer>
węźleglobal.asax.cs
To powinno rozwiązać problemy zarówno z MVC, jak i WebAPI bez konieczności wykonywania innych czynności. Następnie utworzyłem HttpInterceptor w projekcie Angular CLI, który automatycznie dodał odpowiednie informacje nagłówka. Mam nadzieję, że to pomoże komuś w podobnej sytuacji.
źródło
Trochę późno na imprezę,
Jeśli używasz Angular 7 (lub 5/6/7) i PHP jako API i nadal pojawia się ten błąd, spróbuj dodać następujące opcje nagłówka do punktu końcowego (PHP API).
Uwaga : Wymagane jest tylko
Access-Control-Allow-Methods
. Ale wklejam tutaj pozostałe dwaAccess-Control-Allow-Origin
iAccess-Control-Allow-Headers
po prostu dlatego, że będziesz musiał je wszystkie poprawnie ustawić, aby Angular App poprawnie komunikował się z twoim API.Mam nadzieję, że to komuś pomoże.
Twoje zdrowie.
źródło