3

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

我所理解的是,这jsonp是服务器期望的 GET 参数的名称(通常是“回调”),并且jsonpCallback是包装响应的函数的名称。看起来很简单。

但是jQuery.ajax 文档中的解释使这有点复杂。我想在这里引用选项的完整文本,并用粗体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”,为什么要指定它?

我的赞赏。

4

3 回答 3

3

回调名称是可选的,如果你不提供它使用一个默认的。因此,如果您遗漏,onJsonLoad您只会得到callback.

发生的情况是 JSON 被一个函数包裹,因为 JSONP 通过<script>标签工作,所以你的普通 JSON:

{prop: value}

变成:

callback({prop: value});

当脚本标签被加载时,jQuery 可以调用这个函数并取回 JSON 数据。

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

于 2012-11-15T12:48:34.673 回答
3

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 调用的地步(它应该如此)。但是,我认为向您解释其中的核心原则会更容易。

于 2012-11-15T12:58:31.830 回答
1

callback=?

当 Jquery 看到?

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

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

jQuery18104830878316494931_1352981996209( /* json string*/)

jQuery18104830878316494931_1352981996209是回调。

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

于 2012-11-15T13:04:04.080 回答