如何使用 jquery 对 api 进行 jsonp 调用

Posted

技术标签:

【中文标题】如何使用 jquery 对 api 进行 jsonp 调用【英文标题】:How to make a jsonp call to an api using jquery 【发布时间】:2011-05-12 09:50:44 【问题描述】:

我一般是编程新手,当我调用moviedb.org api 时,我无法将数据导入我的网络应用程序。我正在使用 jquery,我已经阅读了所有文档,甚至是食谱,我仍在努力完成这项工作,我还检查了我的谷歌开发工具控制台,它显示调用成功:

Status Code:200 OK
["id":550,"name":"Fight Club","posters":["image":"type":"poster","size":"original","height":1000,"width":675,"url":"http://hwcdn.themoviedb.org/posters/f8e/4b........

这是我的代码:

<script>
   $.getJSON("http://api.themoviedb.org/2.1/Movie.getImages/en/json/ed7e2e092ca896037ce13d2bf11a08f1/550&callback=?",
    function(data)
      $.each(data, function(i,item)
         $("<img/>").attr("src", item.image).appendTo("#images");
      );
    );
 </script>

我想我搞砸了回调函数,任何想法都将不胜感激。 提前致谢!

【问题讨论】:

API 的api.themoviedb.org/2.1 版本不支持JSONP。 Their docs says it is supported in the version 3 API:Unlike previous versions of the API, /3 only supports a single format, JSON. XML and YAML support are being officially dropped. This lets us focus on improving 1 single type and also increases our ability to reuse cached data. JSONP is also officially supported, just add a callback parameter and you’re done. 【参考方案1】:

简而言之,您要访问的服务器似乎不支持 JSONP,这是必须存在的服务器端功能......但不是。我在他们的 API 文档或论坛中也没有看到任何提及。 URL 应该是 ?callback=?,因为它是唯一的查询字符串参数,如下所示:

http://api.themoviedb.org/2.1/Movie.getImages/en/json/<apikey>/550&callback=?

...但这仍然行不通,因为服务器不支持它。顺便说一句:很多时候,带有 API 密钥的东西不会支持 JSONP(因为客户端将拥有密钥),如果 API 它使用密钥来限制访问......其他仅将其用于跟踪可能不在乎。

【讨论】:

这是不正确的。 callback=? 实际上是由 jQuery 更改的,以用生成的函数名称替换 ?。尝试将? 替换为foobar,您将看到返回的有效数据:http://api.themoviedb.org/2.1/Movie.getImages/en/json/ed7e2e092ca896037ce13d2bf11a08f1/550&amp;callback=foobar @hippietrail - 不...答案仍然是正确的,您的网址返回的是不是 JSONP,它没有包含在foobar(&lt;datahere&gt;); 函数调用中,它只是JSON 数据。在说它错误之前测试它:) 我知道 jQuery 如何与 JSONP 参数一起工作......但如果你调用的服务器不支持 JSONP,那根本不相关,这就是为什么重点放在这个回答。 糟糕,API 密钥似乎不再有效,所以我无法检查)-: @hippietrail - 您可以使用任何 API 密钥进行尝试,但事实仍然如此......该服务不支持 JSONP。由于您无法超越这一点,因此无需在此答案中详细说明 jQuery 的工作原理,因为无论您使用哪个客户端库,它都无法正常工作。此外,答案是说他应该在 在他的代码中使用哪个 URLonly 出现在问题中的地方),所以即使在这方面,这个答案有什么不正确的地方? @NickCraver:是的,你是对的,当 API 密钥仍然有效时,我能够找到我下载的旧结果。但也许 OP 为回调提供了错误的参数?让我检查一下 API 文档...【参考方案2】:

这个函数“post”调用服务器

$.post("http://api.themoviedb.org/2.1/Movie.getImages/en/json/ed7e2e092ca896037ce13d2bf11a08f1/550&callback=?", 
   function(data) 
    //After the server code run, this code is executed with the 
    //information of the response into the parameter 'data'
    $.each(data, function(i,item) 
    $("").attr("src", item.image).appendTo("#images");
    );
   , 
 json");

如您所见,我放置了相同的“每个”迭代函数。我不知道您是否正确执行此操作,因为我不执行此代码。但我强烈建议您尝试使用 alert(...) 将代码执行到 function(data)... 中,如下所示:

$.post("http://api.themoviedb.org/2.1/Movie.getImages/en/json/ed7e2e092ca896037ce13d2bf11a08f1/550&callback=?", 
   function(data)
    alert(data);
   , 
"json");

有了这个你真的知道什么是“数据”吗?

希望对你有所帮助。

【讨论】:

【参考方案3】:

首先,您必须确保您调用的 api 支持 jsonp(如果不支持,您将看到 json,但您将无法对其进行任何操作)。

第二。如果您不添加回调名称,那么您将保留 ?callback=?然后 jquery 将在您的 url 末尾添加一个随机数,并且很可能会导致问题。它看起来像这样:

http://someurl.com?callback=140989239

那只会伤害你。在标准 jsonp 中,您实际上将 json 插入到 &lt;script&gt; 标记中。为此,您需要执行以下操作:

var headID = document.getElementsByTagName('head')[0];
var newScript = document.createElement('script');
newScript.type = "text/javascript";
newScript.src = "enter your api url that you are calling here with a specified callback"
headID.appendChild(newScript);

【讨论】:

"首先您必须确保您调用的 api 支持 jsonp(如果不支持,您将看到 json 但您将无法用它做任何事情)。"是的,我在控制台中看到它,但无法访问它。我还看到为回调函数名称生成的随机数。谢谢马特! 所以现在访问它返回的 json 指定一个回调。所以做这样的事情: function makeRequest ( $.getJSON("url?callback=someCallback", ...); ) 然后有另一个函数名为你的回调名称,所以在这种情况下是“someCallback”。 function someCallback do you want with the json in here 如果这不起作用,那么 api 还不支持 jsonp。希望有帮助!

以上是关于如何使用 jquery 对 api 进行 jsonp 调用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery 对 api 进行 jsonp 调用

如何使用数组对 API 数据进行 Json 解码?

如何使用 jQuery 从 Google Directions api 获取 JSON?

jQuery 中与Ajax相关的API

如何使用从 API 调用返回的 JSON 数据使 jquery 自动建议

如何跨不同 API 对 JSON Web 令牌 (JWT) 进行身份验证?