我无法理解jQuery.ajax的文档,特别是两个选项:jsonp
和jsonpCallback
,所以有人可以如此愉快地解释吗?
我的理解是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”,为什么要指定它呢?
我的感激。
答案 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发送的参数,并看到完整的响应