Ich arbeite an meinem persönlichen Projekt nur zum Spaß, wo ich eine XML-Datei lesen möchte, die sich unter http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml befindet, und die XML- und XML-Datei analysieren möchte Verwenden Sie diese Option, um Werte zwischen den Währungen umzurechnen.
Bisher habe ich mir den folgenden Code ausgedacht, der ziemlich einfach ist, um die XML zu lesen, aber ich erhalte den folgenden Fehler.
XMLHttpRequest kann **** nicht laden. In der angeforderten Ressource ist kein Header 'Access-Control-Allow-Origin' vorhanden. Origin ' http://run.jsbin.com ' ist daher kein Zugriff gestattet.
$(document).ready(
function() {
$.ajax({
type: 'GET',
url: 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml',
dataType: 'xml',
success: function(xml){
alert('aaa');
}
});
}
);
Ich sehe nichts falsches an meinem Code, also hoffe ich, dass jemand darauf hinweisen kann, was ich mit meinem Code falsch mache und wie ich es beheben kann.
quelle
Antworten:
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
undwww.ecb.europa.eu
) befinden, versucht Ihr Code tatsächlich, eine domänenübergreifende (CORS) Anforderung zu stellen, die keine gewöhnliche istGET
.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 sindhttp://www.example.com
, wiehttp://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 dannAccess-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).* 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 einePOST
mitapplication/json
als Inhaltstyp), hält der Browser sie einen Moment lang an und sendet vor der Erfüllung zunächst eineOPTIONS
Anfrage an die Ziel-URL. Wie oben wird es nur fortgesetzt, wenn die Antwort auf dieseOPTIONS
Anforderung die CORS-Header enthält. DieserOPTIONS
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 im
Access-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ätigtwww.example.com
! Andere URLs, wieapi.example.com
oder sogarexample.com
oderwww.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.
quelle
Access-Control-Allow-Origin
dieser URLs vorhanden Header spielen überhaupt keine Rolle - der Browser öffnet die URL wie gewohnt. Die Richtlinie mit demselben Ursprung (und die Anforderung für denAccess-Control-Allow-Origin
Header) gilt nur für Ajax-Aufrufe.Es gibt eine Art hack-tastischen Weg, dies zu tun, wenn Sie PHP auf Ihrem Server aktiviert haben. Ändern Sie diese Zeile:
zu dieser Zeile:
und dann im PHP-Skript (wenn Sie die Berechtigung haben, die Funktion file_get_contents () zu verwenden):
Php scheint es nichts auszumachen, wenn diese URL von einem anderen Ursprung ist. Wie ich schon sagte, dies ist eine hackige Antwort, und ich bin sicher, dass etwas nicht stimmt, aber es funktioniert für mich.
Bearbeiten: Wenn Sie das Ergebnis in PHP zwischenspeichern möchten, ist hier die PHP-Datei, die Sie verwenden würden:
Caching-Code von hier nehmen .
quelle
file_get_contents
Aufruf nur auszuführen , wenn die neueste XML-Datei ausreichend datiert ist. Vergessen Sie auch nicht Ihren Content-Type-Header :-)