jsonp请求在Firefox中不起作用

时间:2008-12-18 13:11:44

标签: javascript jquery json

我正在尝试使用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上工作。发出请求但是从服务器返回的内容似乎被忽略。

这是我正在编写的代码还是服务器返回的问题?我该如何诊断这个问题?

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

4 个答案:

答案 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代码以查看诀窍的一个很好的起点。