2008-12-18 89 views
1

我正在尝试使用jquery直接进行远程json调用。我正在尝试使用reddit api。 http://api.reddit.com。这将返回一个有效的json对象。jsonp请求不能在Firefox中工作

如果我调用一个本地文件(这是从保存到本地磁盘的网站返回的东西),事情正常。

$(document).ready(function() { 
    $.getJSON("js/reddit.json", function (json) { 
     $.each(json.data.children, function() { 
      title = this.data.title; 
      url = this.data.url; 
      $("#redditbox").append("<div><a href=\"" + url + "\">" + title + "</a><div>"); 
     }); 
    }); 
}); 

如果我再尝试将其转换为远程调用:

$(document).ready(function() { 
    $.getJSON("http://api.reddit.com", function (json) { 
     $.each(json.data.children, function() { 
      title = this.data.title; 
      url = this.data.url; 
      $("#redditbox").append("<div><a href=\"" + url + "\">" + title + "</a><div>"); 
     }); 
    }); 
}); 

它将很好地工作在Safari,而不是Firefox浏览器。由于安全性或其他原因,Firefox并未进行远程调用,因此期待这一点。精细。

在jQuery的文档,他们说做这样的(JSONP):

$(document).ready(function() { 
    $.getJSON("http://api.reddit.com?jsoncallback=?", function (json) { 
     $.each(json.data.children, function() { 
      title = this.data.title; 
      url = this.data.url; 
      $("#redditbox").append("<div><a href=\"" + url + "\">" + title + "</a><div>"); 
     }); 
    }); 
}); 

但是现在停在Safari和Firefox的工作。请求已完成,但服务器返回的内容似乎被忽略。

这是我写的代码或服务器返回的内容的问题吗?我如何诊断这个问题?

编辑更改地址为真实的地址。

回答

1

您指向的URL(www.redit.com ...)不会返回JSON!不知道从哪里的书签交易JSON联合来,但你可能要开始从docs的例子:

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

}); 

});

(道歉格式)

编辑现在我重新看了你的帖子,我看你打算去api.reddit.com不幸的是你没有得到的JSON回调参数正确的参数名。您可能需要进一步查阅reddit文档以查看它们是否支持JSONP以及回调参数的名称应该是什么。

+0

现在我更仔细地阅读了你的文章的顶部 - 你想要它去api.reddit.com吧? – Jennifer 2008-12-18 13:28:39

3

JSONP是需要在服务器上支持的东西。我无法找到文档,但看起来,如果Reddit支持JSONP,它不会与jsoncallback查询变量。

JSONP做了什么,是用JavaScript函数调用包装JSON文本,这允许JSON文本由您已在代码中定义的任何函数处理。但是,该功能需要在全局范围内可用。看起来,JQuery getJSON方法会为您生成一个函数名称,并将其分配给jsoncallback查询字符串变量。

0

我不确定关于reddit.com,但对于不支持JSONP习惯用法的网站,您仍然可以创建一个代理技术(在后端),它将返回reddit JSON,然后您只需制作一个ajax请求那个。

所以,如果你叫http://mydomain.com/proxy.php?url=http://api.reddit.com

<?php 
$url = $_GET["url"]; 
print_r(file_get_contents($url)); 
?> 
0

http://api.reddit.com/返回JSON,但不显得JSONP友好。您可以通过

% GET http://api.reddit.com/?callback=foo 

的转储JSON流没有JSONP包装验证这一点,如果你有GET。

http://code.reddit.com/browser/r2/r2/controllers/api.py(第84行)显示寻找'回调'(而不是'jsoncallback')的代码。这可能是挖掘Reddit的代码来查看诀窍的一个很好的起点。