请在jQuery中解释JSONP

时间:2012-11-15 12:42:53

标签: jquery jsonp

我无法理解jQuery.ajax的文档,特别是两个选项:jsonpjsonpCallback,所以有人可以如此愉快地解释吗?

我的理解是jsonp是服务器期望的GET参数的名称(通常是'回调'),jsonpCallback是包装响应的函数的名称。看似简单。

jQuery.ajax doc的解释使这有点复杂。我想在此引用jsonp选项的完整文字,并用粗体标记对我来说模糊不清的内容:

  

JSONP

     

覆盖jsonp请求中的回调函数名称。这个值   将在'callback =?'部分使用,而不是'回调'   在url中查询字符串。所以{jsonp:'onJSONPLoad'}会导致   'onJSONPLoad =?'传递给服务器。从jQuery 1.5开始,设置   jsonp选项为false可防止jQuery添加“?回调”   字符串到URL或尝试使用“=?”进行转换。在   在这种情况下,您还应该明确设置jsonpCallback 设置。   例如,{jsonp:false,jsonpCallback:“callbackName”}

所以问题是:

1.这是什么意思“=?”'callback =?'(额外的问号)?当我执行像这里的JSONP AJAX请求时:

 $.ajax('http://fake.com',{
     dataType: 'jsonp',
     success: function(data) {console.log(data);}
 }); 

网址如下所示,没有这样的问号:

http://fake.com/?callback=jQuery18104830878316494931_1352981996209&_=1352981999411

2.什么是额外参数(下划线)_=1352981999411

3. In this case, you should also explicitly set the jsonpCallback setting的意思是什么?我看不出任何相互关系。如果我设置{ jsonp: false, jsonpCallback: "callbackName" },就像在文档中说的那样,查询将如下所示:

http://fake.com/?_=1352981999411

根本没有使用“callbackName”,为什么要指定它呢?

我的感激。

3 个答案:

答案 0 :(得分:3)

回调名称是可选的,如果您不提供回拨名称,则使用默认名称。因此,如果您遗漏onJsonLoad,则只需获得callback

JSON是用函数包装的,因为JSONP通过<script>标记工作,所以你的普通JSON:

{prop: value}

变为:

callback({prop: value});

当加载脚本标记时,jQuery可以调用此函数并获取JSON数据。

_=123456788只是Date.getTime()来阻止请求缓存。

答案 1 :(得分:2)

JSONP背后的理念如下:

由于跨域策略,不允许为外部源请求数据。假设我的服务器有一个函数,如果你输入他的电话号码,它会返回一个人的姓名。

您的网站(不在我的域中)不允许对我的服务器执行ajax调用并接收数据Flater

此规则有一个例外,即使用外部加载的脚本。我可以加载托管在另一台服务器上的jQuery.js文件等。我无法从外部服务器请求数据,但我可以请求 javascript

所以你不可能收到这个结果:

Flater

但是可以将它放在你的页面上:

<script src="http://externalserver.com/script.js">

您将收到常规的javascript,例如

<script>
    function doSomething(value) {
        alert(value);
    }

    doSomething("First");
    doSomething("Second");
</script>

的哪个(以及此处的重要部分)也会收到以下javascript:

<script>
    doSomething("Flater");
</script>

假设您已经在页面上定义了一个函数doSomething()。这可能是一个有效的javascript,因为它调用了一个现有的函数,虽然这个代码段起源的服务器(http://externalserver.com/script.js)不知道函数doSomething中发生了什么。

从技术上讲,你能够在开始时检索你想要的数据(我使用了一个字符串作为示例,但JSON就一样有效),并且它周围的javascript仅用作橱窗装饰('填充')。

现在大多数启用JSONP的网站都会选择该功能的名称。例如:

<script src="http://externalserver.com/script.js?callback=doSomething">
<script src="http://externalserver.com/script.js?callback=banana">
<script src="http://externalserver.com/script.js?callback=Process_Name">

将返回

<script>
    doSomething("Flater");
</script>
<script>
    banana("Flater");
</script>
<script>
    Process_Name("Flater");
</script>

这意味着如果您已经定义了用作回调参数的函数名称,则可以有效地告诉外部服务器将JSON传递给哪个函数。

如果你有多个功能都需要工作,这是非常方便的。

我希望我能够清除JSONP的预期用途?如果您有疑问,请询问: - )

<强>更新

顺便说一句,我在示例中使用了脚本标记。就像你已经提到过的那样,jQuery已经发展到了基本上看起来像ajax调用的程度(应该如此)。但是,我认为更容易向你解释正在发挥作用的核心原则。

答案 2 :(得分:1)

callback=?

Jquery会在看到?

时自动生成回调名称

在某些API中,您需要提供API概述的特定回调。

在大多数情况下,服务器只使用php $_GET['callback']作为示例。在你的情况下,它会发回

jQuery18104830878316494931_1352981996209( /* json string*/)

jQuery18104830878316494931_1352981996209是回调。

为了更好地理解,请在浏览器控制台Net或Network选项卡中检查jsonp请求。你可以看到jQuery发送的参数,并看到完整的响应