Nie będziesz w stanie wykonać wywołania Ajax do http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
z pliku wdrożonego w z http://run.jsbin.com
powodu zasad tego samego pochodzenia .
Ponieważ strona źródłowa (inaczej strona pochodzenia ) i docelowy adres URL znajdują się w różnych domenach ( run.jsbin.com
i www.ecb.europa.eu
), Twój kod w rzeczywistości próbuje wykonać żądanie międzydomenowe (CORS) , a nie zwykłe GET
.
W kilku słowach zasada tego samego pochodzenia mówi, że przeglądarki powinny zezwalać na wywołania Ajax tylko do usług w tej samej domenie strony HTML.
Przykład:
Strona pod adresem http://www.example.com/myPage.html
może bezpośrednio żądać tylko usług znajdujących się pod adresem http://www.example.com
, na przykład http://www.example.com/api/myService
. Jeśli usługa jest hostowana w innej domenie (powiedzmy http://www.ok.com/api/myService
), przeglądarka nie wykona połączenia bezpośrednio (jak można się spodziewać). Zamiast tego spróbuje wysłać żądanie CORS.
Krótko mówiąc, aby wykonać żądanie (CORS) * w różnych domenach, Twoja przeglądarka:
- Zawiera
Origin
nagłówek w pierwotnym żądaniu (z domeną strony jako wartość) i wykonuje to jak zwykle; i wtedy
- Tylko jeśli odpowiedź serwera na to żądanie zawiera odpowiednie nagłówki (
Access-Control-Allow-Origin
jest jednym z nich ) zezwalające na żądanie CORS, przeglądarka zakończy wywołanie (prawie ** dokładnie tak, jak gdyby strona HTML znajdowała się w tej samej domenie).
- Jeśli oczekiwane nagłówki nie pojawią się, przeglądarka po prostu się poddaje (tak jak zrobiła to u Ciebie).
* Powyższe przedstawia kroki w prostym żądaniu, takim jak zwykły GET
bez fantazyjnych nagłówków. Jeśli żądanie nie jest proste (np. POST
Z application/json
typem zawartości jako), przeglądarka zatrzyma je przez chwilę, a przed jego wypełnieniem najpierw wyśle OPTIONS
żądanie do docelowego adresu URL. Podobnie jak powyżej, będzie kontynuowane tylko wtedy, gdy odpowiedź na to OPTIONS
żądanie zawiera nagłówki CORS. To OPTIONS
wywołanie jest znane jako żądanie wstępne .
** Mówię prawie, ponieważ istnieją inne różnice między zwykłymi wywołaniami a wywołaniami CORS. Ważne jest to, że niektóre nagłówki, nawet jeśli są obecne w odpowiedzi, nie zostaną odebrane przez przeglądarkę, jeśli nie zostaną uwzględnione wAccess-Control-Expose-Headers
nagłówku.
Jak to naprawić?
Czy to była tylko literówka? Czasami kod JavaScript zawiera tylko literówkę w domenie docelowej. Czy sprawdziłeś? Jeśli strona jest na www.example.com
, będzie wykonywać tylko regularne połączenia www.example.com
! Inne adresy URL, takie jak api.example.com
lub nawet example.com
lub www.example.com:8080
są uważane za różne domeny przez przeglądarkę! Tak, jeśli port jest inny, to jest to inna domena!
Dodaj nagłówki. Najprostszym sposobem włączenia CORS jest dodanie niezbędnych nagłówków (as Access-Control-Allow-Origin
) do odpowiedzi serwera. (Każdy serwer / język ma na to sposób - sprawdź tutaj kilka rozwiązań ).
Ostatnia deska ratunku: jeśli nie masz dostępu do usługi po stronie serwera, możesz ją również skopiować (za pomocą narzędzi, takich jak odwrotne proxy ) i dołączyć tam wszystkie niezbędne nagłówki.