Ich entwickle eine Seite, die Bilder von Flickr und Panoramio über die AJAX-Unterstützung von jQuery abruft.
Die Flickr-Seite funktioniert einwandfrei, aber wenn ich es $.get(url, callback)
von Panoramio aus versuche, wird in der Chrome-Konsole ein Fehler angezeigt:
XMLHttpRequest kann http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=processImages&minx=-30&miny=0&maxx=0&maxy=150 nicht laden . Origin null ist von Access-Control-Allow-Origin nicht zulässig.
Wenn ich diese URL direkt von einem Browser abfrage, funktioniert es einwandfrei. Was ist los und kann ich das umgehen? Verfasse ich meine Abfrage falsch oder unternimmt Panoramio dies, um zu verhindern, dass ich versuche, dies zu tun?
Google hat in der Fehlermeldung keine nützlichen Übereinstimmungen gefunden .
BEARBEITEN
Hier ist ein Beispielcode, der das Problem zeigt:
$().ready(function () {
var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=processImages&minx=-30&miny=0&maxx=0&maxy=150';
$.get(url, function (jsonp) {
var processImages = function (data) {
alert('ok');
};
eval(jsonp);
});
});
Sie können das Beispiel online ausführen .
BEARBEITEN 2
Vielen Dank an Darin für seine Hilfe. Der obige Code ist falsch. Verwenden Sie stattdessen Folgendes:
$().ready(function () {
var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&minx=-30&miny=0&maxx=0&maxy=150&callback=?';
$.get(url, function (data) {
// can use 'data' in here...
});
});
quelle
iframe
, in die Siedocument.write
zum Beispiel?file:///C:/
). Neiniframe
ist beteiligt.Antworten:
Soweit ich das beurteilen kann, hatten Sie zwei Probleme:
Sie haben Ihrem Typ keinen "jsonp" -Typbezeichner übergeben
$.get
, daher wurde ein gewöhnlicher XMLHttpRequest verwendet. Ihr Browser unterstützte jedoch CORS (Cross-Origin Resource Sharing), um domänenübergreifendes XMLHttpRequest zuzulassen, wenn der Server dies genehmigt hat. Hier kam derAccess-Control-Allow-Origin
Header ins Spiel.Ich glaube, Sie haben erwähnt, dass Sie es von einer Datei aus ausführen: // URL. Es gibt zwei Möglichkeiten für CORS-Header, um zu signalisieren, dass eine domänenübergreifende XHR in Ordnung ist. Eine ist das Senden
Access-Control-Allow-Origin: *
(was, wenn Sie Flickr über$.get
erreicht haben, das getan haben muss), während die andere den Inhalt desOrigin
Headers zurücksendet. Allerdingsfile://
produzieren URLs eine NullOrigin
, die nicht über echo zurück genehmigt werden.Das erste Problem wurde auf Umwegen durch Darins Vorschlag gelöst
$.getJSON
. Es ist ein wenig magisch, den Anforderungstyp von "json" in "jsonp" zu ändern, wenn die Teilzeichenfolgecallback=?
in der URL angezeigt wird .Dies löste das zweite Problem, indem nicht mehr versucht wurde, eine CORS-Anforderung über eine
file://
URL auszuführen .Um dies für andere Personen zu verdeutlichen, finden Sie hier die einfachen Anweisungen zur Fehlerbehebung:
$.get
und einstellendataType
aufjsonp
.$.getJSON
und sindcallback=?
in der URL enthalten.http://
. Skripte, die über ausgeführtfile://
werden, unterstützen CORS nur eingeschränkt.quelle
callback=?
hat bei mir nicht funktioniert, aberjsonp=?
funktioniert. Irgendeine Erklärung dafür?http://
? Oder gibt es eine Möglichkeit, die Datei einfach mit diesem Protokoll zu öffnen?Sie müssen vielleicht einen HEADER in Ihr aufgerufenes Skript einfügen. Folgendes musste ich in PHP tun:
Weitere Informationen finden Sie im domänenübergreifenden AJAX oder im WEB (auf Französisch).
quelle
Für ein einfaches HTML-Projekt:
Dann durchsuchen Sie Ihre Datei.
quelle
POST
Anfragen versuchen , die Sie erhalten:code 501, message Unsupported method ('POST')
für die Brille.Funktioniert für mich unter Google Chrome v5.0.375.127 (ich erhalte die Benachrichtigung):
Außerdem würde ich empfehlen, stattdessen die
$.getJSON()
Methode zu verwenden, da die vorherige unter IE8 (zumindest auf meinem Computer) nicht funktioniert:Sie können es versuchen online von hier aus .
AKTUALISIEREN:
Nachdem Sie Ihren Code angezeigt haben, kann ich das Problem damit erkennen. Sie haben sowohl eine anonyme Funktion als auch eine Inline-Funktion, aber beide werden aufgerufen
processImages
. So funktioniert die JSONP-Unterstützung von jQuery. Beachten Sie, wie ich das definiere,callback=?
damit Sie eine anonyme Funktion verwenden können. Weitere Informationen finden Sie in der Dokumentation .Eine andere Bemerkung ist, dass Sie eval nicht nennen sollten. Der an Ihre anonyme Funktion übergebene Parameter wird bereits von jQuery in JSON analysiert.
quelle
?
wird der zurückgegebene JSON in Klammern gesetzt. Sie definieren keinen Parameter für Ihre Rückruffunktion, und der Wert vonthis
scheint kein Antwortobjekt zu haben (zumindest ist der.data
Wertnull
).callback=?
jQuery an, intern einen zufälligen Funktionsnamen zu generieren, was zu einem Aufruf der anonymen Funktion führt, an die Sie übergeben.getJSON
. Geschätzt.Verwenden Sie die JSONP-Schnittstelle (JSON Padding), solange der angeforderte Server das JSON-Datenformat unterstützt. Sie können damit externe Domänenanforderungen ohne Proxyserver oder ausgefallene Header-Inhalte stellen.
quelle
Es ist dieselbe Ursprungsrichtlinie . Sie müssen eine JSON-P-Schnittstelle oder einen Proxy verwenden, der auf demselben Host ausgeführt wird.
quelle
Wir haben es über die
http.conf
Datei verwaltet (den HTTP-Dienst bearbeitet und dann neu gestartet):In der
Header set Access-Control-Allow-Origin "*"
können Sie eine genaue URL eingeben.quelle
Wenn Sie lokale Tests durchführen oder die Datei von so etwas wie aufrufen
file://
, müssen Sie die Browsersicherheit deaktivieren.Auf MAC:
open -a Google\ Chrome --args --disable-web-security
quelle
In meinem Fall funktionierte derselbe Code in Firefox einwandfrei, jedoch nicht in Google Chrome. In der JavaScript-Konsole von Google Chrome heißt es:
Ich musste den WWW-Teil der Ajax-URL löschen, damit er korrekt mit der Ursprungs-URL übereinstimmt, und dann funktionierte er einwandfrei.
quelle
Nicht alle Server unterstützen jsonp. Der Server muss die Rückruffunktion in den Ergebnissen festlegen. Ich verwende dies, um JSON-Antworten von Websites zu erhalten, die reines JSON zurückgeben, aber JSONP nicht unterstützen:
quelle
Ich benutze den Apache-Server, also habe ich das Modul mod_proxy verwendet. Module aktivieren:
Dann füge hinzu:
Übergeben Sie abschließend die Proxy-URL an Ihr Skript.
quelle
Als letzte Anmerkung der sagt Mozilla Dokumentation ausdrücklich , dass
Infolgedessen ist es nicht einfach eine schlechte Praxis, '*' zu verwenden. Funktioniert einfach nicht :)
quelle
Für PHP - das funktioniert für mich auf Chrome, Safari und Firefox
https://w3c.github.io/webappsec-cors-for-developers/#avoid-returning-access-control-allow-origin-null
mit axios call php live services mit datei: //
quelle
header('Access-Control-Allow-Origin: '.( trim($_SERVER['HTTP_REFERER'],'/') ?:'null'),true);
, um den Cross-Origin von einem Remote-Server zu einem anderen zu ermöglichen und für die lokale Datei auf (string) null zu fallen.Ich habe auch den gleichen Fehler in Chrome erhalten (ich habe andere Browser nicht getestet). Es lag an der Tatsache, dass ich auf domain.com anstatt auf www.domain.com navigierte. Ein bisschen seltsam, aber ich könnte das Problem lösen, indem ich die folgenden Zeilen zu .htaccess hinzufüge. Domain.com wird auf www.domain.com umgeleitet und das Problem wurde behoben. Ich bin ein fauler Webbesucher, daher schreibe ich fast nie das WWW, aber anscheinend ist es in einigen Fällen erforderlich.
quelle
Stellen Sie sicher, dass Sie die neueste Version von JQuery verwenden. Wir hatten diesen Fehler für JQuery 1.10.2 und der Fehler wurde nach Verwendung von JQuery 1.11.1 behoben
quelle
Leute,
Ich bin auf ein ähnliches Problem gestoßen. Aber mit Fiddler konnte ich das Problem lösen. Das Problem besteht darin, dass die Client-URL, die in der CORS-Implementierung auf der Web-API-Seite konfiguriert ist, keinen abschließenden Schrägstrich enthalten darf. Nachdem Sie Ihre Anfrage über Google Chrome gesendet haben, überprüfen Sie die Textview - Registerkarte des Headers besagt Abschnitt von Fiddler, die Fehlermeldung etwas wie folgt aus :
* "Der angegebene Richtlinienursprung your_client_url: / 'ist ungültig. Er kann nicht mit einem Schrägstrich enden."
Das ist wirklich eigenartig, weil es im Internet Explorer ohne Probleme funktioniert hat, aber mir beim Testen mit Google Chrome Kopfschmerzen bereitet hat.
Ich habe den Schrägstrich im CORS-Code entfernt und die Web-API neu kompiliert. Jetzt ist die API ohne Probleme über Chrome und Internet Explorer zugänglich. Bitte probieren Sie es aus.
Danke, Andy
quelle
In der von CodeGroover oben veröffentlichten Lösung gibt es ein kleines Problem: Wenn Sie eine Datei ändern, müssen Sie den Server neu starten, um die aktualisierte Datei tatsächlich zu verwenden (zumindest in meinem Fall).
Also habe ich ein bisschen gesucht und dieses gefunden. Zu verwenden:
Und dann wird es bei dienen
http://localhost:8000
.quelle