【问题标题】:How to make a jsonp call to an api using jquery如何使用 jquery 对 api 进行 jsonp 调用
【发布时间】: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 版本不支持JSONPTheir 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.

标签: jquery api jsonp


【解决方案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。希望有帮助!
    猜你喜欢
    • 2012-01-11
    • 1970-01-01
    • 2012-11-01
    • 2013-07-28
    • 2014-06-21
    • 2010-12-11
    • 1970-01-01
    • 2012-06-05
    • 2018-02-13
    相关资源
    最近更新 更多