jQuery.getJSON - Access-Control-Allow-Origin-Problem
Ich bin jusing jQuery $.getJSON()
- Funktion geben Sie eine kurze Reihe von JSON-Daten.
Ich habe die JSON-Daten sitzen auf einer url wie example.com
.
Ich habe es nicht realisiert, aber als ich den Zugriff auf die gleiche url, die JSON-Daten konnten nicht geladen werden. Ich folgte durch die Konsole und festgestellt, dass XMLHttpRequest
konnte nicht geladen werden aufgrund Access-Control-Allow-Origin
.
Nun, ich habe gelesen durch eine Menge von Websites, die sagte nur zu verwenden $.getJSON()
und das würde die Arbeit um, aber offensichtlich hat es nicht funktioniert. Gibt es etwas, was ich ändern sollte in den Header oder in der Funktion?
Hilfe wird sehr geschätzt.
InformationsquelleAutor der Frage Mike | 2011-06-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist einfach, verwenden Sie
$.getJSON()
Funktion und in Ihrer URL nurals parameter. Konvertieren der Aufruf von JSONP, die notwendig ist, um cross-domain Aufrufe. Mehr info: http://api.jquery.com/jQuery.getJSON/
InformationsquelleAutor der Antwort Hammad Tariq
Können Sie auch verwenden möchten, JSON-P statt (siehe unten). Zunächst wird eine kurze Erklärung.
Den header, die Sie erwähnt haben, ist aus der Cross-Origin Resource Sharing standard. Vorsicht, dass es nicht unterstützt von einigen Browsern auch tatsächlich genutzt werden, und auf anderen Browsern (Microsoft Seufzer) es erfordert die Verwendung von einem speziellen Objekt (
XDomainRequest
) anstelle der standard -XMLHttpRequest
dass jQuery verwendet. Es erfordert auch, dass Sie server-side Ressourcen, die explizit erlauben, die anderen Ursprungs (www.xxxx.com
)., Um die JSON-Daten, die Sie anfordern, haben Sie grundsätzlich drei Optionen:
Wenn möglich, können Sie maximal-kompatibel, indem korrigiert wird, wie der Speicherort der Dateien, die Sie laden, also haben Sie den gleichen Ursprung hat wie das Dokument, das Sie laden Sie in die. (Ich nehme an, Sie muss das laden per Ajax, damit die Same-Origin-Policy Problem auftauchen.)
Verwenden JSON-P, die nicht Gegenstand der SOP. jQuery hat eine eingebaute Unterstützung für Sie in Ihrer
ajax
call (setzen Sie einfachdataType
"jsonp" und jQuery wird alles tun, das client-seitige arbeiten). Dies erfordert server-Seite ändert sich, aber nicht sehr groß; im Grunde, was Sie haben, ist die Generierung der JSON-Antwort, sieht nur für einen query-string-parameter namens "callback" und umschließt das JSON in JavaScript-code, der Aufruf der Funktion. E. g., wenn Ihre aktuelle JSON-Antwort ist:Dein Skript Aussehen würde, für die "callback" - parameter der Abfragezeichenfolge (lassen Sie uns sagen, dass ist der Wert des Parameters "jsop123") und wickelt das JSON in der syntax für eine JavaScript-Funktion aufrufen:
Das ist es. JSON-P ist sehr weitgehend kompatibel (weil es funktioniert über JavaScript
script
- tags). JSON-P ist nur fürGET
jedoch nichtPOST
(wieder, weil es funktioniert überscript
- tags).Verwenden CORS (der Mechanismus, bezogen auf den header, den du zitiert hast). Details in die Spezifikation oben verlinkten, aber im Grunde:
A. Der browser sendet dein server eine "preflight" - Nachricht mit der
OPTIONS
HTTP-verb (- Methode). Darin enthalten sind auch die verschiedenen überschriften, die es senden würde, mit derGET
oderPOST
sowie die Header "Origin", "Access-Control-Request-Methode" (z.B.GET
oderPOST
) und "Access-Control-Request-Header" (Header es senden will.B. PHP entscheidet auf der Grundlage dieser Informationen, ob die Anfrage in Ordnung ist, und wenn ja, antwortet mit "Access-Control-Allow-Origin", "Access-Control-Allow-Methods" und "Access-Control-Allow-Header" Header mit dem Wert, den es zu erlauben. Sie nicht senden alle Körper (Seite) mit dieser Antwort.
C. Der browser sucht auf Ihre Antwort, und siehe, ob es zulässig ist, Ihnen die tatsächlichen
GET
oderPOST
. Wenn dem so ist, wird es zu senden, dass der Wunsch, wieder mit dem "Ursprung" und verschiedene "Access-Control-Request "-xyz" - Header.D. Ihre PHP-untersucht werden diese Header wieder, um sicherzustellen, Sie sind immer noch okay, und wenn, so auf die Anfrage reagiert.
In pseudo-code (ich habe nicht viel getan, PHP, und so bin ich nicht versuchen zu tun, PHP-syntax hier):
Nochmals betont werden, dass dies pseudo-code.
InformationsquelleAutor der Antwort T.J. Crowder