Nie będziesz w stanie wykonać wywołania Ajax do http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xmlz pliku wdrożonego w z http://run.jsbin.compowodu zasad tego samego pochodzenia .
Ponieważ strona źródłowa (inaczej strona pochodzenia ) i docelowy adres URL znajdują się w różnych domenach ( run.jsbin.comi 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.htmlmoż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
Originnagłó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-Originjest 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 GETbez fantazyjnych nagłówków. Jeśli żądanie nie jest proste (np. POSTZ application/jsontypem 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 OPTIONSwywoł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.comlub nawet example.comlub www.example.com:8080są 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.