2009-10-16 7 views
5

Ich versuche eine Cross-Domain-POST-Anfrage zu machen und habe eine Wand (oder zwei) getroffen.Synchrone Cross-Sub-Domain-POST-Anfrage mit jQuery

Ich kann keine Proxy-Seite auf dem Server setzen - so ist das keine Option.

Ich habe getJSON recherchiert, das funktioniert gut, außer dass ich POST nicht GET.

Ist es möglich, dies zu tun? Wenn es nicht ist, kann mir jemand erklären, wie getJSON funktioniert und warum ich keine POST-Alternative machen kann.

Antwort

26

Sie CANNOT einen Cross-Domain-Antrag stellen (GET/POST/etc.) mit einem XMLHttpRequest (auch bekannt als AJAX).

Wenn Sie vom Server unterstützt werden, können Sie eine JSONP-Anfrage stellen. Ein JSONP Anfrage funktioniert wie folgt:

  • jQuery erstellt eine global zugängliche Funktion aus der Callback-Funktion, die Sie als Argument liefern
  • Statt XMLHttpRequest (AJAX) für die Verwendung der HTTP-Anforderung zu machen, fügt jQuery dynamisch ein Skript Tag in das DOM
  • das SRC des Script-Tag die Anforderungs-URL ist, an die Sie
  • jQuery fügt einen Rückruf param auf die Query-String wie so versuchen zu kommunizieren: example.com/someurl.js?callback=someDynamicallyGeneratedMethodName
  • Es ist dann oben an den Server JavaScript zurückzukehren, die Ihr Client, indem man das JSON Ergebnis als Argument

someDynamicallyGeneratedMethodName Wenn Sie keine Kontrolle über den Server haben können, dass Sie eine Mitteilung verfassen, dann hat man kein Glück, JSONP tu dir sehr gut. Was auch immer der Server zurückgibt, ist in einem SCRIPT-Tag und wird wahrscheinlich einen Fehler auslösen, wenn er nicht korrekt formatiert ist.

Für weitere Informationen zu diesem Thema, schlage ich vor, Sie schauen sich die Basis $ .Ajax-Funktion anstelle der Verknüpfungen. (In der jQuery-Dokumentation unter Ajax. Sorry, ich kann keine weiteren Links posten)

Nochmals, wenn Sie keine Kontrolle über den Server haben, auf den Sie posten, sollten Sie, wenn möglich, in einen Proxy schauen. Andernfalls kann ein IFRAME Ihre einzige andere Option sein. Es gibt auch eine Methode, um dies mit einem SWF (Flash) -Objekt zu erreichen. Ich habe beides nicht versucht, aber sie sind Workarounds zu den Einschränkungen des XMLHttpRequest-Objekts.

Ich hoffe, ich könnte helfen!

+0

+1. Toller Beitrag und willkommen in SO! – aolde

+0

Danke für die Erklärung. Danach ist es viel klarer als eine Stunde Googeln. Ich habe Zugriff auf den Server, auf den ich poste, also ist alles gut. –

+2

Äh, wie steht dieser Kommentar zum Thema? Es bezieht sich nicht auf POST, die der OT ausdrücklich verlangt! – HRJ

2

Sie können einen Beitrag verfassen, aber Sie möchten eine JSONP-Anfrage, um die domänenübergreifenden Probleme zu umgehen. Im Wesentlichen stellen Sie eine Callback-Funktion bereit und die Anfrage kommt als Skript-Inhalt zurück und Ihr Callback wird mit den JSON-Daten aus der Anfrage aufgerufen. Ihr serverseitiges Skript muss die Daten als Funktionsaufruf mithilfe der Rückruffunktion bereitstellen, die um das JSON-Objekt gewickelt ist.

Siehe Dokumentation zur post Funktion.

$.post('/example.com/controller/action?callback=?', 
     { param: "data" }, 
     function(data) { 
      ...do something with the data... 
     }, 'jsonp'); 

ASP.NET MVC Aktion für diesen:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Action(string param, string callback) 
{ 
    var jsonData = ...do something and construct some data in JSON... 

    return Content(callback + "(" + jsonData + ");"); 
} 
+1

Für die Zukunft: Es scheint, Google Chrome 6.0.472.63 dies nicht wie zu viel. In Safari wird der zurückgegebene JSON verarbeitet, aber Chrome zeigt nur "Null Null ist nicht erlaubt von Access-Control-Allow-Origin." Botschaft. – Cimm

0

Wenn Sie wollen, dann ist die einfachste Lösung, Cross Domain POST zu tun, die ein here von Matteo zur Verfügung gestellt. Es funktionierte gut für mich