请在jQuery中解释JSONP
我无法理解jQuery.ajax的文档,特别是两个选项: jsonp
和jsonpCallback
,所以有人可以这么愉快地解释吗?
我的理解是jsonp
是服务器期望的GET参数的名称(通常是’回调’), jsonpCallback
是包装响应的函数的名称。 看似简单。
但是jQuery.ajax doc的解释使这有点复杂。 我想在这里引用jsonp
选项的完整文本,并用粗体标记对我来说模糊不清的内容:
JSONP
覆盖jsonp请求中的回调函数名称。 在‘callback =?’中将使用此值代替’callback ‘ url中查询字符串的一部分。 所以{jsonp:’onJSONPLoad’}会导致‘onJSONPLoad =?’ 传递给服务器。 从jQuery 1.5开始,将jsonp选项设置为false可防止jQuery将“?callback”字符串添加到URL或尝试使用“=?” 转型。 在这种情况下, 您还应该显式设置jsonpCallback设置。 例如,{jsonp:false,jsonpCallback:“callbackName”}
所以问题是:
1.这是什么意思“=?” 或‘回调=?’ (额外的问号)? 当我执行像这里的JSONP AJAX请求时:
$.ajax('http://fake.com',{ dataType: 'jsonp', success: function(data) {console.log(data);} });
URL看起来像这样,没有这样的问号:
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”,为什么要指定它呢?
我的欣赏。
回调名称是可选的,如果您不提供回调名称,则使用默认名称。 因此,如果你遗漏onJsonLoad
你就会得到callback
。
会发生什么是JSON包含一个函数,因为JSONP通过标记工作,所以你的普通JSON:
{prop: value}
变为:
callback({prop: value});
加载脚本标记后,jQuery可以调用此函数并获取JSON数据。
_=123456788
只是一个Date.getTime()
来阻止缓存请求。
JSONP背后的想法如下:
由于跨域策略,不允许为外部源请求数据。 假设我的服务器有一个函数,如果你输入他的电话号码,它会返回一个人的姓名。
您的网站不在我的域中,不允许对我的服务器执行ajax调用并接收数据Flater
。
此规则有一个例外,即使用外部加载的脚本。 我可以加载托管在另一台服务器上的jQuery.js文件等。我不能从外部服务器请求数据 ,但我可以请求javascript 。
所以你不可能收到这个结果:
Flater
但是可以将它放在你的页面上:
你将收到常规的javascript,例如
这意味着(以及这里的重要部分)您还可以收到以下javascript:
假设您已在页面上定义了函数doSomething()
。 这将是一个有效的javascript,因为它调用了一个现有的函数,虽然这个代码片段起源的服务器( http://externalserver.com/script.js
)不知道函数doSomething
发生了什么。
所以从技术上讲,你能够在开始时检索你想要的数据(我使用了一个字符串作为例子,但JSON就一样有效),并且它周围的javascript仅用作橱窗装饰('padding') 。
现在大多数启用JSONP的站点都会选择该function的名称。 例如:
会回来的
这意味着如果您已经定义了用作回调参数的函数名称,则可以有效地告诉外部服务器将JSON传递给哪个函数。
如果你有多个function都需要工作,这是非常方便的。
我希望我能够清除JSONP的预期用途? 如果您有疑问,请问:-)
UPDATE
顺便说一句,我在示例中使用了脚本标记。 就像你已经提到的那样,jQuery已经发展到了基本上看起来像ajax调用的程度(应该如此)。 但是,我认为更容易向您解释正在发挥作用的核心原则。
callback=?
Jquery会在看到回调名称时自动生成回调名称?
在某些API中,您需要提供API概述的特定回调。
在大多数情况下,服务器只使用PHP作为示例使用$_GET['callback']
。 在你的情况下它会发回
jQuery18104830878316494931_1352981996209( /* json string*/)
jQuery18104830878316494931_1352981996209
是回调。
为了更好地理解,请在浏览器控制台Net或Network选项卡中检查jsonp请求。 你可以看到jQuery发送的参数,并看到完整的响应