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?
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?
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.
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:
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.
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.
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:
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.
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 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.