Senden cross-domain-ajax-POST-request
Ich schwöre, ich sah einen Artikel über diese in einem Punkt aber kann es nicht finden...
Wie kann ich eine jQuery-ajax-Anfrage vom Typ POST auf einer anderen domain? Muss erreicht werden, ohne einen proxy. Ist das möglich?
- stimmt, ich ziehe meinen Kommentar 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie können alle Sie wollen, auch
$.post()
funktioniert...aber werden Sie nicht bekommen eine Antwort zurück.Diese Werke, die andere domain wird Holen Sie sich die POST:
Aber die Antwort
data
im obigen Beispiel den Wert "null" durch die same-origin policy.Alle Optionen, die ich habe experimentiert mit:
1) SCHWEINEFLEISCH: http://www.schizofreend.nl/Pork.Iframe/Examples/ Erstellt ein iframe ein und sendet die post da ist, dann liest die Antwort. Weiterhin erfordert die gleiche Basis domain pro
Anfrage (d.h. http://www.foo.com anfordern können
Daten aus www2.foo.com aber nicht aus
http://www.google.com) . Auch erfordert, dass Sie
fiddle mit den
document.domain
Eigenschaft, die bewirkt, dass unerwünschte Nebeneffekte
Effekte. Und es gibt ein weit verbreitetes problem in allen gängigen Browsern, wo das Neuladen der Seite im Grunde mischt der zwischengespeicherte Inhalt alle iframes auf der Seite, wenn eine von Ihnen werden dynamisch geschrieben. Deine Antwort-Daten zeigen bis in die box, wo ein ad sein soll.
2) flxhr: http://flxhr.flensed.com/ Kann auch verwendet werden, um die Maske jQuery built-in ajax, so dass Sie es nicht einmal bemerken. Erfordert flash, also das iPhone ist aus
3) jsonp: funktioniert nicht, wenn Sie die Buchung eine Menge von Daten. boo.
4) aufgeteilte jsonp: Wenn Ihr jsonp-Anfrage zu groß ist, brechen Sie die Abfrage-string, die bis in handliche Stücke und senden Sie mehrere Anfragen bekommen. Rekonstruieren Sie auf dem server. Dies ist hilfreich, aber bricht, wenn Sie load balancing Benutzern zwischen Servern.
5) CORS: http://www.w3.org/TR/cors/ funktioniert nicht in älteren Browsern (IE7, IE6, Firefox 2, etc.)
Also wir haben derzeit den folgenden Algorithmus:
Verbringen Sie einen Nachmittag schreiben, und Sie werden in der Lage sein, um es für gut. Hinzufügen von CORS zu unseren Algorithmus könnte gut für schnellere iPhone-Unterstützung.
Wenn man die Kontrolle über den code laufen auf der anderen Domäne, lass es einfach eine entsprechende
Access-Control-Allow-Origin
- header in der Antwort. Siehe auch HTTPAccess Control
am MDC.Access-Control
Header. Unabhängig davon, ist der browser-support ist in fast allen modernen Browsern/updates jünger als 1 Jahr.Wenn Sie möchten, eine fire-and-forget-POST, wo Sie kümmern sich nicht über die Antwort, dann stellen Sie einfach ein Formular in einem versteckten iframe. Dies erfordert einen Transitional-Doctype-Deklaration.
Wenn Sie möchten, analysieren Sie die Antwort, dann verwenden Sie einen proxy, wenn die einzige wirkliche option.
Wenn Sie verzweifelt und Steuerung der remote-site, dann Sie können:
Dieser Ansatz ist, um race-Bedingungen und in der Regel hässlich. Proxing der Daten durch den aktuellen domain ist eine viel besseren Ansatz.
<iframe>
überhaupt, Sie sind mitXmlHttpRequest()
die BUCHEN ist nicht gesperrt, nur immer die Antwort ist.<iframe>
Idee für was jQuery nicht unter kam, gibt es einen Artikel gibt, dies sage, oder eine Dokumentation, die gibt, die Eindruck?Wenn Sie brauchen, um zu wissen, dass der POST erfolgreich war, und haben keine Kontrolle über den remote-server:
Wenn es ein problem mit dem Beitrag ist, dann
response.statusText
sollte gleich"error"
.Hinweis: einige remote-Server senden HTTP-header
Access-Control-Allow-Origin: *
, die in einem200 OK
HTTP-status-code der Antwort. In diesem Fall, ajax führt diesuccess
handler, und diese Methode ist nicht erforderlich. Zu sehen an der Reaktion nur tunconsole.log(JSON.stringify(response));
oder verwenden Sie FireBug s 'Net' panel.