我正在尝试使用jquery进行直接的远程json调用。我正在尝试使用reddit api。 http://api.reddit.com。这将返回一个有效的json对象。
如果我调用本地文件(从保存到本地磁盘的网站返回的文件),一切正常。
$(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上工作。发出请求但是从服务器返回的内容似乎被忽略。
这是我正在编写的代码还是服务器返回的问题?我该如何诊断这个问题?
编辑将地址更改为真实地址。
答案 0 :(得分:3)
JSONP是服务器上需要支持的东西。我找不到文档,但看起来,如果Reddit支持JSONP,那么它不是jsoncallback查询变量。
JSONP的作用是使用JavaScript函数调用包装JSON文本,这允许JSON文本由您已在代码中定义的任何函数处理。但是,此功能确实需要从全局范围中获得。似乎JQuery getJSON方法为您生成函数名称,并将其分配给jsoncallback查询字符串变量。
答案 1 :(得分:1)
您指向的网址(www.redit.com ...)未返回JSON!不确定来自reddit的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以及回调参数的名称应该是什么。
答案 2 :(得分: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));
?>
答案 3 :(得分:0)
http://api.reddit.com/返回JSON,但似乎不是JSONP友好的。如果您有GET,可以通过
验证这一点% GET http://api.reddit.com/?callback=foo
在没有JSONP包装的情况下转储JSON流。
http://code.reddit.com/browser/r2/r2/controllers/api.py(第84行)显示了寻找'回调'的代码(不是'jsoncallback')。这可能是挖掘Reddit代码以查看诀窍的一个很好的起点。