JSONP:是否需要回调?

时间:2012-08-04 22:27:46

标签: jquery json web-services jsonp

我正在使用AJAX,jQuery和Phonegap创建iOS / Droid应用程序。后端是一个Drupal 7站点,通过Web服务提供内容。不过,我对JSONP回调的必要性感到有些困惑。

我的理解是,为了允许跨域请求,需要JSONP。而且,在某种程度上,它的工作原理是将JSON数据包装在回调函数中,从而使其成为一个对象。

然而,我发现我可以在没有回调的情况下发送JSONP请求,并通过jQuery解析数据而不使用回调函数。因此,JSONP数据看起来与JSON数据完全相同。

我错过了什么吗?如果将数据作为函数提供是JSONP的一个好处,那么在该过程的某个阶段是否应该不需要它?我是否通过不发送回调参数来绕过某种程度的安全性?

谢谢!

仅供参考,这是jQuery AJAX代码:

$.ajax({
    type: 'GET',
    cache: false,
    url: 'http://www.example.com/mobile/menu/devel-gosto.jsonp',
    dataType: 'jsonp',
    timeout: menuLoadTimeout,
    success: function (data) {
        menu = populateSlider(data.tree, 0);
    }
}); 

所以我将dataType设置为'jsonp',调用返回JSONP数据的Web服务,但将回调保留在URL之外。 Web服务在没有回调包装器的情况下响应。一切正常。

4 个答案:

答案 0 :(得分:3)

JSONP是针对同源策略(SOP)而设计的,该策略声明如果HTML页面是从一个域提供的,那么网页(一旦传递到客户端)就无法进行“Ajax调用”不同域名的网站。如果对同一个域进行“Ajax调用”,一切都很好。 (也许是你看到的?)

现在,您无法对不同的域进行Ajax调用,但可以使用脚本标记来调用其他域上的代码(如图所示,嗯?)。现在的问题是,假设您在脚本标记中调用了另一个域,并且您获得了一些JSON文本。你将如何任何事情?这就是JSONP的用武之地。如果服务器发回一些包含在函数调用中的JSON,那么当你评估那个(包装好的)对象时,你现在正在“用它做一些事情。”

但是,大多数浏览器都支持CORS,因此不需要JSONP。但是,一些较旧的浏览器不支持CORS,但这些浏览器越来越少。

答案 1 :(得分:3)

没有回调,JSONP调用无效。数据加载到script标记中,如果代码不是方法调用的形式,结果将只是一个被丢弃的对象,而success回调方法永远不会调用。

即使您未指定回调参数,ajax方法也会向网址添加回调参数。

在文档中,"jsonp"设置的dataType值下:

  

“在网址末尾添加额外的”?callback =?“以指定   回调“。

http://api.jquery.com/jQuery.ajax/

答案 2 :(得分:1)

  

是否需要回电?

是的,当然。回调对JSON-with-padding的定义很重要。没有,它只是JSON。

答案 3 :(得分:0)

是的,这是必需的。默认函数名称是回调,但可以是任何声明的函数名称。

https://jar-download.com/java-documentation-javadoc.php?a=jersey-json&g=com.sun.jersey&v=1.19.2

它为我们提供了一种访问返回数据的方法。它通过让服务器返回包含在函数调用(“填充”)中的JSON数据来实现这一点,然后可以由浏览器进行解释。必须在评估JSONP响应的页面中定义此函数。

see here