发送 JSONP 与 JSON 数据?

Posted

技术标签:

【中文标题】发送 JSONP 与 JSON 数据?【英文标题】:Sending JSONP vs. JSON data? 【发布时间】:2011-06-08 15:51:29 【问题描述】:

我正在制作一个需要以 JSONP 格式返回数据的 Web 服务。我正在为 JSP 使用 JSON taglib,我认为所有必须添加的只是括号,但我找不到一个很好的资源来验证这一点。

例如,曾经使用此函数返回的 Web 服务函数:

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

这对吗?

谢谢!

【问题讨论】:

【参考方案1】:

JSONP 只是一种允许 Web 应用程序跨域检索数据的 hack。可以说违反了Same Origin Policy (SOP)。它的工作方式是使用 javascript 将“脚本”元素插入您的页面。因此,您需要一个回调函数。如果您没有,您的 Javascript 将无法访问 JSON 对象。但是通过使用 JSONP,您的 Javascript 代码可以调用回调函数。

所以你必须指定回调名称。所以你的函数可能看起来像这样:

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

【讨论】:

您应该有权访问 http 请求对象或至少以某种方式访问​​已发送的回调,通常采用以下形式:example.com?callback=name123 是的,为了扩展 Abdullah 的观点,您的 Javascript 代码应该调用函数“name123”来获取 JSON。 啊,谢谢,我现在明白回调了。但是,我不确定如何在 Web 服务中检索它。我可以在我的函数中要求它作为参数,但这似乎不像 Abdullah 举例说明的那样能够在链接中解析它那样用户友好。具体来说,这是在类中使用的,Web 服务允许访问这些方法。请求对象可以在类内部使用吗? example.com?callback=name123 将调用您的 JSP servlet,后者又调用函数“getJSONPObject”并将“name123”作为“回调”参数传递。【参考方案2】:

我添加了一个示例来使用 Jquery 和 Servlet 或 JAX-WS webservice 解决跨域 JSONP(带填充的 Json)。

请查看这篇文章。 http://reddymails.blogspot.com/2012/05/solving-cross-domain-problem-using.html

【讨论】:

以上是关于发送 JSONP 与 JSON 数据?的主要内容,如果未能解决你的问题,请参考以下文章

json与jsonp的使用

面试整理跨域:jsonp与CORS

json与jsonp区别浅析(json才是目的,jsonp只是手段)

Json与JsonP

区分json与jsonp

json与jsonp详解