Sie können aufgrund der Richtlinie mit demselben Ursprung keinen Ajax-Aufruf http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
von einer Datei aus tätigen, die unter bereitgestellt wurde .http://run.jsbin.com
Da sich die Quellseite (auch als Ursprungsseite bezeichnet ) und die Ziel- URL in verschiedenen Domänen ( run.jsbin.com
und www.ecb.europa.eu
) befinden, versucht Ihr Code tatsächlich, eine domänenübergreifende (CORS) Anforderung zu stellen, die keine gewöhnliche ist GET
.
Mit wenigen Worten, die Richtlinie mit demselben Ursprung besagt, dass Browser nur Ajax-Aufrufe an Dienste in derselben Domäne der HTML-Seite zulassen sollten .
Beispiel:
Eine Seite bei http://www.example.com/myPage.html
nur direkt anfordern Dienste , die auf sind http://www.example.com
, wie http://www.example.com/api/myService
. Wenn der Dienst in einer anderen Domain gehostet wird (z. B. http://www.ok.com/api/myService
), führt der Browser den Anruf nicht direkt durch (wie erwartet). Stattdessen wird versucht, eine CORS-Anfrage zu stellen.
Um es kurz zu machen, um eine (CORS) Anfrage * über verschiedene Domänen hinweg auszuführen, Ihr Browser:
Origin
Fügt der ursprünglichen Anforderung einen Header hinzu (mit der Domain der Seite als Wert) und führt ihn wie gewohnt aus. und dann
- Nur wenn die Server - Antwort auf diese Anforderung die enthält ausreichende Header (
Access-Control-Allow-Origin
ist einer von ihnen ) so dass der CORS anfordern, wird vervollständigt das Durchsuchen , um den Anruf (fast ** genau so , wie es wäre , wenn die HTML - Seite in der gleichen Domäne ist).
- Wenn die erwarteten Header nicht kommen, gibt der Browser einfach auf (wie bei Ihnen).
* Das Obige zeigt die Schritte in einer einfachen Anfrage, z. B. eine reguläre Anfrage GET
ohne ausgefallene Header. Wenn die Anfrage nicht einfach ist (wie eine POST
mit application/json
als Inhaltstyp), hält der Browser sie einen Moment lang an und sendet vor der Erfüllung zunächst eine OPTIONS
Anfrage an die Ziel-URL. Wie oben wird es nur fortgesetzt, wenn die Antwort auf diese OPTIONS
Anforderung die CORS-Header enthält. Dieser OPTIONS
Aufruf wird als Preflight- Anforderung bezeichnet.
** Ich sage fast, weil es andere Unterschiede zwischen regulären Anrufen und CORS-Anrufen gibt. Ein wichtiger Punkt ist, dass einige Header, auch wenn sie in der Antwort vorhanden sind, vom Browser nicht erfasst werden, wenn sie nicht imAccess-Control-Expose-Headers
Header enthalten sind.
Wie man es repariert?
War es nur ein Tippfehler? Manchmal hat der JavaScript-Code nur einen Tippfehler in der Zieldomäne. Hast du kontrolliert? Wenn die Seite auf ist www.example.com
, werden nur regelmäßige Anrufe getätigt www.example.com
! Andere URLs, wie api.example.com
oder sogar example.com
oder www.example.com:8080
werden vom Browser als andere Domains betrachtet ! Ja, wenn der Port anders ist, dann ist es eine andere Domain!
Fügen Sie die Überschriften hinzu. Die einfachste Möglichkeit, CORS zu aktivieren, besteht darin Access-Control-Allow-Origin
, den Antworten des Servers die erforderlichen Header (as ) hinzuzufügen . (Jeder Server / jede Sprache hat eine Möglichkeit, dies zu tun - überprüfen Sie hier einige Lösungen .)
Letzter Ausweg: Wenn Sie keinen serverseitigen Zugriff auf den Dienst haben, können Sie ihn auch spiegeln (über Tools wie Reverse-Proxys ) und dort alle erforderlichen Header einfügen.