Wie sende ich eine cross-domain-POST-Anfrage via JavaScript?
Wie sende ich eine cross-domain-POST-Anfrage via JavaScript?
Fest - es sollte nicht die Seite aktualisieren, und ich brauche, um zu greifen und zu analysieren, die Reaktion danach.
Ich würde gerne wissen, ein wenig über die use-case, mit der Sie versuchen, dies zu tun. Könnten Sie bitte sagen Sie etwas über ihn?
Im Grunde arbeite ich an einem Skript, das senden muss, um text aus einer HTML-Datei auf einem anderen server für die Verarbeitung.
Können Sie einen proxy benutzen, wird dieser auf der server-Seite und gibt nur Ihr Skript das Ergebnis? Oder muss es 100% sein JavaScript?
Im Grunde arbeite ich an einem Skript, das senden muss, um text aus einer HTML-Datei auf einem anderen server für die Verarbeitung.
Können Sie einen proxy benutzen, wird dieser auf der server-Seite und gibt nur Ihr Skript das Ergebnis? Oder muss es 100% sein JavaScript?
InformationsquelleAutor Ido Schacham | 2008-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Update:, Bevor Sie fortfahren sollte jeder Lesen und verstehen, die html5rocks-tutorial auf CORS. Es ist leicht zu verstehen und sehr klar.
Wenn Sie den server Steuern Gebucht wird, einfach nutzen Sie die "Cross-Origin Resource Sharing standard" - Einstellung-Antwort-Header an den server. Die Antwort auf diese Frage diskutiert, auch in anderen Antworten in diesem thread, aber nicht sehr klar in meiner Meinung.
Kurz hier ist, wie Sie bei der Durchführung der cross-domain-POST aus from.com/1.html zu to.com/postHere.php (mit PHP als Beispiel). Hinweis: Sie müssen nur
Access-Control-Allow-Origin
für NICHTOPTIONS
- Anforderungen - das Beispiel legt immer alle Header für einen kleineren code-snippet.In postHere.php setup die folgenden:
Dies ermöglicht, dass das Skript, um cross-domain-POST, GET und OPTIONEN. Dies wird klar werden, wie Sie weiter Lesen...
Richten Sie Ihre cross-domain-POST von JS (jQuery Beispiel):
Wenn Ihr die POST in Schritt 2 sendet Ihr browser uns eine "OPTIONEN" - Methode an den server. Dies ist ein "schnuppern", die vom browser angezeigt, wenn der server ist cool mit Ihnen veröffentlicht. Der server antwortet mit einer "Access-Control-Allow-Origin" erzählt die browser seine OK, um POST|GET|ORIGIN, wenn Anforderung stammt aus "http://from.com" oder "https://from.com". Da der server OK ist mit ihm, stellt der browser eine 2. Anfrage (diesmal ein POST). Es ist gute Praxis, um Ihre Kunden die content-type-es ist zu senden - so dass Sie brauchen werden, um zu ermöglichen, dass als gut.
MDN hat eine große write-up über HTTP access control, dass geht ins detail, wie der gesamte flow funktioniert. Nach Ihren docs, es soll "funktionieren in Browsern, die Unterstützung von cross-site XMLHttpRequest". Dies ist ein wenig irreführend, aber, wie ich DENKE nur moderne Browser erlauben es, cross-domain-POST. Ich habe nur überprüft, das funktioniert mit safari,chrome,FF 3.6.
Bitte beachten Sie Folgendes, wenn Sie dies tun:
Ja, Sie sollten in der Lage sein. Nie versuchte er, tho. Ihre server zurückgeben 200? Auch ist Ihr server Rücksendung der Kopfzeilen über die Optionen UND POST-Anfragen? Ich aktualisiert meine Antwort mit mehr Details über diese. Stellen Sie sicher, dass Ihr server reagiert, mit dem richtigen content-type-header auch (wie text/html). Meine Empfehlung ist google chrome verwenden, klicken Sie rechts auf der Seite>element untersuchen. Klicken Sie auf die Registerkarte Netzwerk, und sehen Sie die POST und die Antwort. Sollten Ihnen Informationen auf, was schief läuft.
Ich habe dies ausprobiert, aber bekomme immer noch
400 Bad Request
aufOPTIONS
Anfrage. und infirefox
die zweite Anfrage vonPOST
nie gemacht. 🙁Gibt es eine Möglichkeit, callout Ihrem lokalen Rechner in Ihrem Fall Aussage oben? Oder tun Sie nur verwenden Sie die * in diesem Fall für die Ursprungs-URLs zulassen.
Sie können eine Domäne in der Access-Control-Allow-Origin, aber Nachteil ist, dass Sie cant fügen Sie eine Liste von Domänen.
InformationsquelleAutor rynop
Wenn Sie den remote-server Steuern, Sie sollten wahrscheinlich verwenden, CORS, wie in dieser Antwort; es unterstützt in IE8 und höher, und alle letzten Versionen von FF, GC und Safari. (Aber im IE8 und 9, CORS nicht erlauben das senden von cookies in der Anforderung.)
So, wenn Sie nicht den remote-server Steuern, oder wenn Sie zur Unterstützung von IE7, oder wenn Sie cookies benötigen, und haben Sie zu unterstützen IE8/9, werden Sie wahrscheinlich wollen, um ein iframe-Element-Technik.
Hier ist Beispiel-code; habe es getestet auf IE6, IE7, IE8, IE9, FF4, GC11, S5.
Achtung! Sie werden nicht in der Lage, um direkt die Antwort Lesen von der POST, da der iframe befindet sich auf einer separaten Domäne. Frames sind nicht erlaubt, miteinander zu kommunizieren aus unterschiedlichen Domänen; dies ist die same-origin policy.
Wenn Sie den remote-server Steuern, aber Sie nicht verwenden können, CORS (z.B. weil Sie auf IE8/IE9, und Sie müssen, um cookies zu verwenden), gibt es Möglichkeiten zum umgehen der same-origin-policy, zum Beispiel durch Verwendung von
Fenster.postMessage
und/oder einer von einer Reihe von Bibliotheken, so dass Sie zum senden von cross-domain und cross-frame-Nachrichten, die in älteren Browsern:Wenn Sie keine Kontrolle über die remote-server, dann kannst du nicht Lesen Sie die Antwort von der POST, Zeit. Es würde zu Sicherheit sonst Probleme.
Müssen Sie form.Ziel etwas, oder sonst der browser zu navigieren Weg von Ihrer Website auf die Aktion " Formular-URL. Außerdem, der string muss eindeutig sein; wenn es andere frames oder Fenster mit dem gleichen Namen, die form posten könnte, die an das Fenster anstatt Ihre iframe. Aber wie einzigartig muss es sein? Wahrscheinlich nicht sehr. Die Verschiedenheit von Stress sind ziemlich klein. zucken
Als ich sagte in meiner Antwort, Sie haben zu tun, die cross-domain und cross-frame-Kommunikation, um das Ergebnis in Ihrem web-Seite. Es erfordert, dass Sie die Steuerung des remote-web-server, so dass Sie können ändern, seine Reaktion zu ermöglichen, die Kommunikation mit Ihrem web-Seite. (Für eine Sache, werden kann muss der server eine Antwort mit HTML; wenn der server antwortet mit XML-Rohdaten, es kann nicht frame-übergreifende Kommunikation.)
+1 - das ist die beste Lösung, die ich gefunden habe, wenn Sie nicht über Zugriff auf den server
Nein, das wäre eine Sicherheitslücke.
InformationsquelleAutor Dan Fabulich
Pseudocode
Werden Sie wahrscheinlich wollen, um Stil der iframe ausgeblendet werden und absolut positioniert. Nicht sicher, dass cross-site-posting erlaubt über den browser, aber wenn das so ist, das ist, wie es zu tun.
Danke. Fand diese nützliche links in Bezug auf die Rolle: bindzus.wordpress.com/2007/12/24/... developer.apple.com/internet/webcontent/iframe.html
Problem!!! Die Resonanz in der das iframe liegt in einer anderen Domäne, so dass das Haupt-Fenster hat keinen Zugriff darauf, auch nicht das iframe-Zugriff auf das Hauptfenster. Also diese Lösung scheint nur gut für das erledigen der POST, aber Sie können nicht Parsen der Antwort hinterher 🙁
Versuchen Sie, ein onload im body-tag die Antwort auf eine JavaScript-Funktion, die eine Funktion aufruft, in der Elternteil mit dem response-string.
Diese Antwort hat bei mir nicht funktioniert; ich habe meine eigene Variante unter.
InformationsquelleAutor Lou Franco
Halten Sie es einfach:
cross-domain-POST:
verwenden
crossDomain: true,
sollte nicht die Seite aktualisieren:
Nein, es ist nicht aktualisieren Sie die Seite als
success
odererror
asynchronen callback wird aufgerufen, wenn der server schickt die Antwort.Beispiel-Skript:
crossDomain: true
seltsamerweise absolut nichts zu tun hat mit echter cross-domain-requests. Wenn die Anforderung ist cross-domain, jquery setzt dieses auf true automatisch.InformationsquelleAutor Alain Gauthier
Wenn Sie haben Zugriff auf alle beteiligten Server, geben Sie Folgendes in den header der Antwort für die Seite angefordert wird, in der anderen Domäne:
PHP:
Beispielsweise in Drupal ' s xmlrpc.php code, den Sie dies tun:
Dies erzeugt möglicherweise ein Sicherheits-problem, und Sie sollten sicherstellen, dass Sie geeignete Maßnahmen, um die Anfrage prüfen.
InformationsquelleAutor Robb Lovell
Überprüfen Sie die
post_method
Funktion in http://taiyolab.com/mbtweet/scripts/twitterapi_call.js - ein gutes Beispiel für die iframe-Methode wie oben beschrieben.InformationsquelleAutor ndeuma
Erstellen Sie zwei versteckte iframes (add "display: none;" zum css-Stil). Machen Sie Ihre zweite iframe zeigen Sie auf etwas auf Ihrer eigenen domain.
Erstellen Sie eine versteckte form, dessen Methode auf "post" target = Ihre erste iframe, und setzen Sie Optional enctype auf "multipart/form-data" (ich denke, Sie wollen, um die POST zu tun, weil Sie möchten, senden multipart-Daten wie Bilder?)
Wenn Sie bereit sind, machen die form submit() der POST.
Wenn du die andere domain zurück javascript, die die Cross-Domain-Kommunikation Mit Iframes ( http://softwareas.com/cross-domain-communication-with-iframes ), dann haben Sie Glück, und Sie können das erfassen der Antwort, wie auch.
Natürlich, wenn Sie wollen, um Ihren server als proxy, können Sie vermeiden, all dies. Senden Sie uns einfach das Formular auf Ihrem eigenen server, der proxy die Anforderung an den anderen server (vorausgesetzt, die anderen server nicht so eingerichtet ist, um zu bemerken, IP-Diskrepanzen), erhalten Sie die Antwort, und kehren Sie was Sie wollen.
InformationsquelleAutor Magarshak
Eine weitere wichtige Sache zu beachten!!!!!
In Beispiel oben ist es beschrieben, wie mithilfe
JQuery 1.6 und untere hat einen bug mit cross domain XHR.
Laut Firebug keine Anforderungen außer OPTIONEN gesendet wurden. Kein POST. An alle.
Verbrachte 5 Stunden Prüfung/tuning mein code. Das hinzufügen einer Menge von Headern auf dem remote-server (Skript). Ohne jede Wirkung.
Aber später habe ich schon aktualisiert JQuery-lib zu 1.6.4, und alles funktioniert wie ein Charme.
Wie hast du die PHP-proxy? Kannst du mich führen auf, dass?
siehe die Antworten weiter unten, z.B. von Ivan Durst
InformationsquelleAutor BasTaller
Wenn Sie dies tun wollen, in ASP.net MVC-Umfeld mit JQuery, AJAX, gehen Sie folgendermaßen vor:
(dies ist eine Zusammenfassung der angebotenen Lösung an diese thread)
Davon ausgehen, dass "caller.com"(kann eine beliebige website) braucht, um post zu "server.com"(ein ASP.net MVC-Anwendung)
Auf dem "server.com" app-Web.config fügen Sie den folgenden Abschnitt:
Auf dem "server.com" wir haben Sie folgende Aktion auf dem controller(genannt "Home"), zu denen wir werde Entsendung:
Dann von der "caller.com", post Daten aus einem Formular(mit der html-id "formId") zu "server.com" wie Folgen:
InformationsquelleAutor Sujeewa
Hohem Niveau.... Sie müssen einen cname-setup auf Ihrem server, so dass other-serve.your-server.com Punkte zu other-server.com.
Ihre Seite dynamisch erzeugt einen unsichtbaren iframe, welche Handlungen als Ihren transport other-server.com. Sie haben dann die Kommunikation per JS von der Seite auf die other-server.com und haben call-backs, die die Daten zurück, die zurück zu Ihrer Seite.
Möglich, erfordert aber eine Koordination von your-server.com und other-server.com
Ich sehe nicht, wie dies zu lösen wäre nichts. Kreuzung auf eine andere subdomain hat die gleichen Probleme wie die Kreuzung auf eine andere domain.
InformationsquelleAutor
Ich denke, der beste Weg ist die Verwendung von XMLHttpRequest (z.B. $.ajax(), $.post() in jQuery) mit einem Cross-Origin Resource Sharing polyfills https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills#wiki-CORS
InformationsquelleAutor Roman Dolgiy
Gibt es eine weitere Möglichkeit (mit html5-Funktion). Sie können proxy verwenden-iframe gehostet werden, dass die andere Domäne, die Sie senden, Nachricht mit postMessage an das iframe, dann das iframe tun können, nach Anfrage (auf der gleichen domain) und postMessage wieder mit reposnse an das übergeordnete Fenster.
Eltern auf sender.com
iframe auf reciver.com
vielleicht so etwas wie dieses gist.github.com/jcubic/26f806800abae0db9a0dfccd88cf6f3c
Dieser code erfordert eine änderung receiver-Seite. Wie die Antwort Lesen, wenn die Empfänger-Seiten können nicht geändert werden ?
Sie können nicht, müssen Sie Zugang zu recever.com iframe senden von ajax-Anfragen gibt. Ohne iframe wird es keine Anfragen.
InformationsquelleAutor jcubic
Dies ist eine alte Frage, aber einige neue Technologie könnte helfen, jemanden.
Wenn Sie haben administrativen Zugriff auf den anderen server, dann können Sie die opensource-Schmiede-Projekt zu erreichen, Ihre cross-domain-POST. Forge bietet eine domänenübergreifende JavaScript-XmlHttpRequest-wrapper, die die Vorteile von Flash-raw-socket API. Die POST kann auch über TLS.
Der Grund, benötigen Sie administrativen Zugriff auf den server, den Sie Buchen ist, weil, müssen Sie eine cross-domain-policy, die es erlaubt den Zugriff aus der Domäne.
http://github.com/digitalbazaar/forge
InformationsquelleAutor dlongley
Ich weiß, das ist eine alte Frage, aber ich wollte meine Herangehensweise. Ich benutze cURL als proxy sehr einfach und konsistent. Erstellen Sie eine php-Seite aufgerufen submit.php und fügen Sie den folgenden code:
Dann im js (jQuery hier):
InformationsquelleAutor Ivan Durst
Sollte möglich sein, mit einem YQL benutzerdefinierte Tabelle + JS XHR, werfen Sie einen Blick auf:
http://developer.yahoo.com/yql/guide/index.html
Ich es verwenden, um einige client-Seite (js) html kratzen, funktioniert einwandfrei
(Ich habe eine volle audio-player, mit einer Suche im internet/Playlisten/lyrics/last fm Informationen, alle client-js + YQL)
InformationsquelleAutor Guillaume86
CORS ist für Sie.
CORS ist eine "Cross-Origin Resource Sharing", ist eine Möglichkeit zum senden von cross-domain-Anfrage.Jetzt das XMLHttpRequest2-und Fetch-API unterstützt CORS, und es kann senden beide POST-und GET-Anforderung
Aber es hat seine Grenzen.Server müssen bestimmte Forderung der Access-Control-Allow-Origin", und es kann nicht auf ' * ' gesetzt.
Und wenn du willst, dass jeder Herkunft senden können, bitte an Sie, die Sie benötigen, JSONP (müssen auch Access-Control-Allow-Origin", aber Sie können '*')
Für viele Anfrage Weg, wenn Sie nicht wissen, wie zur Auswahl, ich glaube, Sie brauchen ein voll funktionsfähiges Bauteil, das zu tun.Lassen Sie mich Ihnen eine einfache Komponente https://github.com/Joker-Jelly/catta
Wenn Sie mit einem modernen browser (> IE9, Chrome, FF, Edge, etc.), Sehr Empfehlen Ihnen eine einfache, aber Schönheit Komponente https://github.com/Joker-Jelly/catta.Es haben sich keine Abhängigkeit, Weniger als 3KB, und es Unterstützung Holen, AJAX und JSONP mit gleichen tödlichen sample syntax und Optionen.
Es auch es der Unterstützung aller Art zu importieren, um Ihr Projekt, wie ES6 module, CommonJS und sogar
<script>
im HTML-Format.InformationsquelleAutor Jelly
Wenn Sie Zugriff auf die cross-domain-server und nicht wollen, um irgendwelche änderungen am code auf der server-Seite, können Sie eine Bibliothek mit dem Namen - 'xdomain'.
Wie es funktioniert:
Schritt 1:
server 1: schließen Sie die xdomain-Bibliothek und konfigurieren von cross-domain als slave:
Schritt 2:
auf cross-domain-server, erstellen Sie eine proxy.html Datei-und server 1 als master:
Schritt 3:
Nun, Sie können machen Sie einen AJAX-Aufruf an die proxy.html als Endpunkt von server1. Dies ist die bypass-CORS Anfrage. Die Bibliothek intern iframe-Lösung, die arbeitet mit Anmeldeinformationen und alle möglichen Methoden: GET, POST etc.
Abfrage ajax-code:
InformationsquelleAutor Raj Malakpet