2008-12-18 128 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的代碼來查看訣竅的一個很好的起點。