Ist es möglich, Daten an JsonP zu senden? Oder müssen alle Daten als GET-Anfrage im Querystring übergeben werden?
Ich habe viele Daten, die ich domänenübergreifend an den Dienst senden muss, und sie sind zu groß, um über den Querystring gesendet zu werden
Welche Möglichkeiten gibt es, um dies zu umgehen?
POST
Anfragen an andere Domains stellen, solange diese Domain und Ihr Browser dies unterstützenCORS
. Aber es ist völlig richtig, dassPOST
undJSONP
nicht kompatibel sind.<script>
Tags eingefügt werden, die auf eine andere Domäne verweisen. Die einzige Möglichkeit, POST-Anforderungen in einem Browser auszuführen, besteht in HTML-Formularen oder XMLHttpRequest.Wenn Sie viele Daten domänenübergreifend senden müssen. Normalerweise erstelle ich einen Dienst, den Sie in zwei Schritten aufrufen können:
Zuerst sendet der Client ein FORMULAR (Post erlaubt domänenübergreifend). Der Dienst speichert die Eingabe in der Sitzung auf dem Server (unter Verwendung der GUID als Schlüssel). (Der Client erstellt eine GUID und sendet sie als Teil der Eingabe.)
Anschließend führt der Client eine normale Skriptinjektion (JSONP) als Parameter durch. Sie verwenden dieselbe GUID wie im FORM-Beitrag. Der Dienst verarbeitet die Eingaben aus der Sitzung und gibt die Daten auf normale JSONP-Weise zurück. Danach wird die Sitzung zerstört.
Dies hängt natürlich davon ab, dass Sie das Server-Backend schreiben.
quelle
XMLHttpRequest
sollte überhaupt nicht beteiligt sein. Per's Antwort verwendet eine reguläre Formularübermittlung, um die POST-Anfrage zu stellen, und dann eine Skriptelementinjektion, um die GET-Anfrage zu stellen.Ich weiß, dass dies eine ernsthafte Nekromantie ist, aber ich dachte, ich würde meine Implementierung von JSONP POST mit jQuery veröffentlichen, das ich erfolgreich für mein JS-Widget verwende (dies wird für die Kundenregistrierung und -anmeldung verwendet):
Grundsätzlich verwende ich einen IFrame-Ansatz, wie in der akzeptierten Antwort vorgeschlagen. Was ich anders mache, ist nach dem Senden der Anfrage, ob das Formular im Iframe mit einem Timer erreichbar ist. Wenn das Formular nicht erreicht werden kann, bedeutet dies, dass die Anforderung zurückgegeben wurde. Dann verwende ich eine normale JSONP-Anforderung, um den Status des Vorgangs abzufragen.
Ich hoffe, dass jemand es nützlich findet. Getestet in> = IE8, Chrome, FireFox und Safari.
quelle
Im Allgemeinen wird JSONP implementiert, indem
<script>
dem aufrufenden Dokument ein Tag hinzugefügt wird , sodass die URL des JSONP-Dienstes "src" ist. Der Browser ruft die Skriptquelle mit einer HTTP-GET-Transaktion ab.Befindet sich Ihr JSONP-Dienst in derselben Domäne wie Ihre aufrufende Seite, können Sie wahrscheinlich mit einem einfachen
$.ajax()
Aufruf etwas zusammenschustern . Wenn es nicht in derselben Domäne ist, bin ich mir nicht sicher, wie es möglich wäre.quelle
CORS
wird, ist dies möglich, solange der Browser dies ebenfalls unterstützt. In diesen Fällen verwenden SieJSON
eher Plain alsJSONP
.Sie können mit diesem Projekt einen CORS-Proxy verwenden . Der gesamte Datenverkehr wird an einen Endpunkt in Ihrer Domain geleitet und diese Informationen an eine externe Domain weitergeleitet. Da der Browser alle Anfragen registriert, um sich in derselben Domain zu befinden, können wir JSON veröffentlichen. HINWEIS: Dies funktioniert auch mit SSL-Zertifikaten, die auf dem Server gespeichert sind.
quelle
Es gibt eine (Hack-) Lösung, die ich schon oft gemacht habe. Sie können mit JsonP posten. (Sie können ein Formular veröffentlichen, das größer als 2000 Zeichen ist, als Sie von GET verwenden können.)
Client-Anwendung Javascript
JAVA:
PHP:
Auf diese Weise öffnen Sie Ihren Server für jede Post-Anfrage. Sie sollten dies erneut sichern, indem Sie eine Identität oder etwas anderes angeben.
Mit dieser Methode können Sie auch den Anforderungstyp von jsonp in json ändern. Beide funktionieren, stellen Sie einfach den richtigen Antwortinhaltstyp ein
jsonp
json
Bitte nicht, dass Ihr Server die SOP (Same Origin Policy) nicht mehr respektiert, aber wen interessiert das?
quelle
<script>
Tags in Ihr HTML-DOM einzufügen (Sie können sie sogar in Desktop-Apps verwenden, beispielsweise mehrere JSON-Anforderungen an denselben Server senden und den Funktionsnamen verwenden zum Beispiel als Anforderungsverfolgungs-ID).Es ist möglich, hier ist meine Lösung:
In Ihrem Javascript:
In Ihrer url.php:
quelle