2011-01-13 3 views
10

Ich mache einen Webdienst, der Daten im JSONP-Format zurückgeben muss. Ich benutze die JSON-Taglib für JSP, und ich dachte, dass alles, was hinzugefügt werden musste, Klammern waren, aber ich kann keine gute Ressource finden, die dies überprüft.Senden von JSONP vs. JSON-Daten?

Zum Beispiel jemals Web-Service-Funktion kehrt mit dieser Funktion:

private static String getJSONPObject(String s) throws JSONException { 
    return "(" + new JSONObject(s) + ")"; 
} 

Ist das richtig?

Danke!

Antwort

22

JSONP ist einfach ein Hack, damit Web-Apps Daten über Domains hinweg abrufen können. Es könnte gesagt werden, dass es die Same Origin Policy (SOP) verletzt. Die Art und Weise, wie es funktioniert, ist die Verwendung von Javascript, um ein "Skript" -Element in Ihre Seite einzufügen. Daher benötigen Sie eine Rückruffunktion. Wenn Sie keinen haben, hat Ihr Javascript keine Möglichkeit, auf das JSON-Objekt zuzugreifen. Aber mit JSONP kann Ihr JavaScript-Code die Callback-Funktion aufrufen.

Sie müssen also den Rückrufnamen angeben. So könnte Ihre Funktion wie folgt aussehen:

private static String getJSONPObject(String callback, String s) throws JSONException { 
    return callback + "(" + new JSONObject(s) + ")"; 
} 
+2

Sie sollten Zugriff auf die HTTP-Request-Objekt haben oder zumindest eine gewisse Art und Weise den Rückruf des Zugriffs auf die gesendet wurde, in der Regel in dieser Form: http://example.com?callback=name123 –

+0

Ya, und erweitern Sie auf Abdullahs Punkt, Ihr Javascript-Code sollte dann die Funktion "name123" aufrufen, um den JSON zu erhalten. –

+0

ah, danke, ich verstehe den Rückruf jetzt. Ich bin mir jedoch nicht sicher, wie ich es im Web-Service abrufen kann. Ich könnte es als einen Parameter in meiner Funktion fragen, aber das scheint nicht so benutzerfreundlich zu sein, als es in der Verbindung analysieren zu können, wie Abdullah es veranschaulicht. Insbesondere wird dies in einer Klasse verwendet, und der Webdienst ermöglicht den Zugriff auf diese Methoden. Kann das Anfrageobjekt innerhalb der Klasse verwendet werden? – Garrett