2010-09-06 59 views
0

帮助,我很困惑。
我只需要让JSON对象进入我的页面。网址如下:JSON对象为null,即使Feed是有效的JSON

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回归。

+0

为什么你觉得这个对象是空的?这应该可以正常工作,除非您尝试迭代不在Disqus响应中的'data.items'属性。这可能是问题的根源吗? – 2010-09-06 19:12:56

+0

因为警报(数据)会提示“null”。 – AP257 2010-09-06 21:41:38

回答

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})响应格式。

+0

天才。谢谢! – AP257 2010-09-06 21:43:33

0

将自己提供的两个URL复制到浏览器窗口中,DISQUS URL会返回一个错误“Problem loading page”。

+0

嗯,一个问题是'MYKEY'不是有效的Disqus API密钥。 – 2010-09-06 19:13:51

0

的Disqus调用缺少一个回调函数

0

api_response_format=jsonp:callback说法应该是由你的Javascript中定义的回调函数的名称。假设我有一个叫做handleJson的函数,它应该解析一个JSON响应,然后你必须通过参数jsonp:handleJson。然后,Disqus会将你的代码传递给handleJson

JSONP带来的是能够绕过同域起源策略。假设一个URL < http://foo/json>与此JSON对象响应:

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

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

假设你现在请求URL成为< http://foo/json?callback=handleJson>和API提供与此回应:

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

现在,浏览器将尝试运行JavaScript的那个片段的环境中,你”内已经定义。所以如果你定义了一个handleJson函数,它将被调用。

这就是JSONP是一种规避同域起源策略并为您提供跨JSON对象的跨站点脚本的方法。

0

另外,如果你的日期没有用零填充,那么事件将不会显示。例如, 2010-9-5不错 Ex。 2010-09-05不错