Search

1/11/2008

flickr's json format api

JSON一個很大的好處是可以 corss-domain,利用動態產生出來的 script tag 把 remote JSON 給load 進來,for example


var script = document.createElement('script');
script.setAttribute('src', 'http://api.flickr.com/services/rest/?format=json&method=flickr.people.getPublicPhotos&api_key=e8bde2fca0855f7e712e091fd6384bcf&user_id=79311125%40N00&');
script.setAttribute('id', 'json');
script.setAttribute('type', 'text/javascript');
document.documentElement.firstChild.appendChild(script);

通常 JSON load進來之後我們才可以對它進行一些處理,不過要如何知道 JSON 已經 load進來了?根據 石頭閒語:Load and Execute JavaScript on Demand, by createElement - 樂多日誌,我們可以用 script.onload = function(){ code goes here ...},不過似乎 IE 不能用,該篇文章 propose 的方法是每 0.1 秒去檢查變數進來了沒。

今天玩了一下 Flickr 的 JSON format API,發現 Flickr 的解法太聰明了,一個 Flickr API的回傳值看起來像是底下這樣子:

jsonFlickrApi({
"stat" : "fail",
"code" : "97",
"message" : "Missing signature"
})

這個回傳值只做了一件事情,就是呼叫 jsonFlckrApi 這個 function,再把整個資料的 object 丟過去。所有只要我們在頁面有個這樣的function,for example

function jsonFlickrApi(rsp){
console.log(rsp["stat"], rsp["code"], rsp["msg"] )
}

在我們收到 JSON 的回傳值之後,jsonFlickrApi這個 function 會被呼叫起來做動作,簡單,明瞭,免 polling,缺點就只有一個,就是 function 名稱是被定死的,不過這也沒什麼。
update: flickr 可以自己定義 callback function name
Flickr Services
Callback Function

If you just want the raw JSON, with no function wrapper, add the parameter nojsoncallback with a value of 1 to your request.

To define your own callback function name, add the parameter jsoncallback with your desired name as the value.

nojsoncallback=1 -> {...}
jsoncallback=wooYay -> wooYay({...});

update: 在FF下,每次都要重新建立一個script tag,如果重複使用同一個script tag,則只會執行第一次而已,IE則是每次都會執行。

沒有留言: