4 Stimmen

Absenden einer Cross-Domain-AJAX-POST-Anfrage

Ich schwöre, ich habe irgendwann einen Artikel darüber gesehen, kann ihn aber nicht finden...

Wie kann ich eine jQuery-AJAX-Anfrage vom Typ POST an eine andere Domain senden? Muss ohne Proxy durchgeführt werden. Ist das möglich?

9voto

Nick Craver Punkte 609016

Ja, Sie können so viel wie Sie wollen POSTEN, sogar $.post() funktioniert... aber Sie werden keine Antwort erhalten.

Dies funktioniert, die andere Domäne wird den POST bekommen:

$.post("http://othersite.com/somePage.php", { thing: "value" }, function(data) {
  //data wird immer null sein
});

Aber die Antwort, data im obigen Beispiel, wird aufgrund der Same-Origin-Richtlinie null sein.

3voto

Mike Ruhlin Punkte 3476

Alle Optionen, die ich ausprobiert habe:

1) SCHWEINEFLEISCH: http://www.schizofreend.nl/Pork.Iframe/Examples/ Erstellt ein iframe und sendet dort den Beitrag ab, liest dann die Antwort. Erfordert immer dieselbe Basisdomäne pro Anfrage (d. h. www.foo.com kann Daten von www2.foo.com anfordern, aber nicht von www.google.com). Erfordert auch, dass man mit der document.domain-Eigenschaft herumspielt, was negative Auswirkungen hat. Und es gibt ein weitverbreitetes Problem in allen gängigen Browsern, bei dem das Neuladen der Seite im Wesentlichen die zwischengespeicherten Inhalte aller iframes auf der Seite durcheinander bringt, wenn diese dynamisch geschrieben sind. Ihre Antwortdaten erscheinen in dem Feld, in dem eigentlich eine Anzeige stehen sollte.

2) flxhr: http://flxhr.flensed.com/ Kann sogar verwendet werden, um den eingebauten Ajax von jQuery zu maskieren, so dass man ihn kaum bemerkt. Erfordert jedoch Flash, also ist das iPhone ausgeschlossen.

3) jsonp: Funktioniert nicht, wenn viele Daten übertragen werden. Schade.

4) fragmentiertes Jsonp: Wenn Ihre jsonp-Anforderung zu groß ist, zerlegen Sie die Abfragezeichenfolge in handhabbare Teile und senden Sie mehrere GET-Anforderungen. Auf dem Server wieder zusammensetzen. Das ist hilfreich, aber funktioniert nicht, wenn Benutzer zwischen Servern ausgelastet werden.

5) CORS: http://www.w3.org/TR/cors/ funktioniert nicht in älteren Browsern (IE7, IE6, Firefox 2, etc.)

Also verwenden wir derzeit den folgenden Algorithmus:

  • Wenn die Anforderung klein genug ist, verwenden wir JSONP
  • Wenn nicht klein genug, aber der Benutzer Flash hat, verwenden wir FlXHR
  • Andernfalls verwenden wir fragmentiertes JSONP

Verbringen Sie einen Nachmittag damit, das zu schreiben, und Sie werden es gut verwenden können. Die Hinzufügung von CORS zu unserem Algorithmus könnte gut sein, um eine schnellere Unterstützung für das iPhone zu erhalten.

2voto

BalusC Punkte 1034465

Wenn Sie die Kontrolle über den Code haben, der auf der anderen Domain ausgeführt wird, lassen Sie ihn einfach einen passenden Access-Control-Allow-Origin-Header in der Antwort zurückgeben. Siehe auch HTTP Access-Control bei MDC.

0voto

Quentin Punkte 850700

Wenn Sie einen Fire-and-Forget-POST möchten, bei dem Sie die Antwort nicht interessiert, senden Sie einfach ein Formular an ein verstecktes iFrame. Dies erfordert ein Transitional Doctype.

Wenn Sie die Antwort analysieren möchten, ist die Verwendung eines Proxys die einzige echte Option.

Wenn Sie verzweifelt sind und die entfernte Website kontrollieren, können Sie folgendes tun:

  1. Ein Formular wie oben senden
  2. Ein Cookie in der Antwort setzen (das möglicherweise blockiert wird, bevor das iFrame das Cookie als 'Drittanbieter' betrachten könnte (d. h. wahrscheinlich zur Werbeverfolgung gehörend).
  3. Geben Sie lange genug Zeit für die Antwort
  4. Generieren Sie dynamisch ein Skriptelement mit dem src, das auf die entfernte Website zeigt
  5. Verwenden Sie JSON-P in der Antwort und nutzen Sie die zuvor im Cookie gespeicherten Daten

Dieser Ansatz ist anfällig für Wettbewerbsbedingungen und im Allgemeinen hässlich. Das Durchleiten der Daten über die aktuelle Domäne ist ein viel bessere Ansatz.

0voto

Alex W Punkte 34972

Wenn Sie wissen müssen, dass der POST erfolgreich war und keine Kontrolle über den Remote-Server haben:

                $.ajax({
                    type:"POST",
                    url:"http://www.somesite.com/submit",
                    data:'firstname=test&lastname=person&email=test@test.com',
                    complete: function(response){
                        if(response.status == 0 && response.statusText == "success")
                        {
                            /* CORS POST war erfolgreich */
                        }
                        else
                        {
                            /* Fehlermeldung anzeigen */
                        }
                    }
                });

Wenn ein Problem bei der Übermittlung auftrat, sollte response.statusText gleich "error" sein.

Hinweis: Einige Remote-Server senden möglicherweise den HTTP-Header Access-Control-Allow-Origin: *, was zu einer 200 OK HTTP-Statuscode-Antwort führt. In diesem Fall wird ajax den success-Handler ausführen, und diese Methode ist nicht erforderlich. Um die Antwort anzusehen, verwenden Sie console.log(JSON.stringify(response)); oder verwenden Sie das 'Net'-Panel von FireBug.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X