2

我正在使用 AJAX、jQuery 和 Phonegap 创建一个 iOS / Droid 应用程序。后端是通过 Web 服务提供内容的 Drupal 7 站点。不过,我对 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

4 回答 4

3

JSONP 是为了响应同源策略 (SOP) 而设计的,该策略指出,如果 HTML 页面是从一个域提供的,那么网页(一旦交付给客户端)就不能对上的站点进行“Ajax 调用”不同的域。如果对同一个域进行了“Ajax 调用”,那么一切都很好。(也许是你看到的?)

现在,您不能对不同的域进行 Ajax 调用,但可以使用脚本标记来调用不同域上的代码(看图,嗯?)。现在的问题是,假设您在脚本标签中调用了一个不同的域,并返回了一些 JSON 文本。你会怎么处理它?这就是 JSONP 的用武之地。如果服务器发回一些包装在函数调用中的 JSON,那么当您评估该(包装的)对象时,您现在正在“用它做一些事情”。

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

于 2012-08-04T22:41:18.347 回答
3

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

ajax即使您没有指定回调参数,该方法也会向 URL 添加回调参数。

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

“在 URL 的末尾添加一个额外的“?callback=?”以指定回调。”

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

于 2012-08-04T22:46:58.383 回答
1

是否需要回调?

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

于 2012-08-04T22:42:08.370 回答
0

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

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

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

看这里

于 2017-06-16T13:25:02.860 回答