即使feed是有效的JSON,JSON对象也是null

时间:2010-09-06 19:06:20

标签: json jquery jsonp

帮助,我很困惑。
我只需要将JSON对象放入我的页面。 URL如下:

http://disqus.com/api/get_forum_posts/?user_api_key=MYKEY&forum_id=MYID&api_version=1.1

如果我使用Flickr API URL和getJSON example中给出的代码,它可以正常工作:

<script>$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
        function(data){
          alert(data);
          $.each(data.items, function(i,item){
            $("<img/>").attr("src", item.media.m).appendTo("#images");
            if ( i == 3 ) return false;
          });
        });</script>

但是,如果我在上面的Disqus网址中替换,则数据为空。在阅读JSON Feed Returning null while using jQuery getJSON之后,我检查了这个URL是否返回了有效的JSON,并且确实如此。

Disqus API似乎暗示它支持JSONP - '你也可以传递“jsonp:callback”作为“api_response_format”参数'。我已经尝试添加此参数,但它没有帮助。

我做错了什么?我怀疑问题可能是我并不真正理解JSON和JSONP之间的区别,以及我需要做些什么来恢复JSONP。

5 个答案:

答案 0 :(得分:2)

您可以这样称呼它:

$.ajax({
  url: 'http://disqus.com/api/get_forum_posts/?user_api_key=MYKEY&forum_id=MYID&api_version=1.1&api_response_format=jsonp:myFunction',
  dataType:  'jsonp'
});
function myFunction(data) { //make sure this is available globally
  //use data
}

You can give it a try here

与您的文档链接一样,结尾api_response_format=jsonp:myFunction上的参数是关键,请直接检查链接here,即使由于密钥错误,请查看格式如何不同?这就是JSONP调用所需要的,functionName({data})响应格式。

答案 1 :(得分:0)

将您自己提供的两个URL复制到浏览器窗口中,DISQUS URL返回错误“问题加载页面”。

答案 2 :(得分:0)

Disqus调用缺少回调函数

答案 3 :(得分:0)

api_response_format=jsonp:callback参数应该是您的Javascript定义的回调函数的名称。所以假设我有一个名为handleJson的函数,它应该解析JSON响应,然后你必须传递参数jsonp:handleJson。然后,Disqus会将调用的代码传递给handleJson

JSONP带来的是绕过同域原始策略的能力。假设网址&lt; http://foo/json&gt;使用此JSON对象进行响应:

{
  id: 2,
  first_name: 'John',
  last_name: 'Doe',
}

您可以使用该对象的唯一方法是,如果您也使用域foo。但是,如果您无法访问该域,假设您正在访问返回JSON格式对象的API,那么您需要从该API提供程序获得一些帮助。

假设您现在请求的网址变为&lt; http://foo/json?callback=handleJson&gt;并且API提供者回复:

handleJson({id: 2, first_name: 'John', last_name: 'Doe'})

现在,浏览器将尝试在您定义的环境中运行该Javascript片段。因此,如果您已定义handleJson函数,则会调用它。

这就是JSONP,它是一种绕过同域原始策略并为您提供JSON对象的跨站点脚本的方法。

答案 4 :(得分:0)

此外,如果您的日期未填充零,则不会显示事件。 防爆。 2010-9-5不好 防爆。 2010-09-05好