2011年1月4日 星期二

Facebook ActionScript Graph API ( 2 ) Graph API的GET、POST與DELETE

完成授權與登入後,接下來呼叫API的方式不管是外部Web連結Facebook,或者是IFrame App.,都沒有差別。由於等等我們要測試自動發布到塗鴉牆的功能,所以login的時候請多加上"publish_stream"這個extended permission,並確定重新執行一次login。然後我們做一個介面類似這樣:

由上而下放了三個TextField:
apiRequest_txt:輸入Graph API Request用的,例如:/me/friends。
params_txt:當使用POST時,需要帶的參數。這裡因為AS的Object不方便用String去轉,因此我們設計讓user輸入JSON encoded的String,然後再用as3corelib的JASON.decode將它解回Object。輸入例如:{"message":"test message!"}。
result_txt:將回傳的結果顯示出來。這裡可以將result轉成JSON encoded String之後顯示出來。
左邊放個名為btnApi的Button在輸入完後去呼叫。另外放個method_cb的ComboBox來選擇要用GET、POST或是DELETE。

程式的部分,這裡用到Facebook.api()、Facebook.postData()以及Facebook.deleteObject()三個method。其實翻翻文件就知道這三個方法要怎麼使用了。
Facebook.api():
這個method有四個參數可以輸入,第一個就是我們輸入的apiRequest_txt.text,就是我們要呼叫的API。第二個是callback function,我們寫一個requestHandler統一來處理。如果使用GET讀取資料,那麼以上兩個參數基本上就可以了。第三個是params_txt.text再decode成Object,如果我們要額外傳參數,例如查詢/me/friends時想限制回傳欄位只要id時,這邊可以輸入:{"fields":"id"},這樣就不會回傳name了。如果是要搜尋的話,可以查詢/search,然後這裡填入例如:{"q":"gray","type":"user"},搜尋名字裡有"gray"的user。這個參數也在POST時可以使用。第四個參數預設是"GET",也可選擇"POST"。

Facebook.postData():
使用POST的簡便方法。三個參數跟Facebook.api()的前三個參數一樣,因為request method限定為POST,因此沒有第四個參數。可以試著呼叫:/me/feed,params_txt輸入:{"message":"test message!"},就可以發訊息到塗鴉牆上面了。

Facebook.deleteObject():
當我們要刪除object時可以用的方法。只有兩個參數,與Facebook.api()的前兩個參數相同。第一個就輸入我們想刪除的object id,例如剛剛發出去的訊息:/16xxxxx_xxxxxx,就可以將這一則訊息刪除了。

ActionScript
概念講完,看一下重要的程式碼。當btnApi Click時執行:
var requestMethod:String = method_cb.selectedLabel;
var params:Object = null;
if (requestMethod == "POST")//當選擇POST時
{
  params = JSON.decode(params_txt.text);
  Facebook.postData(apiRequest_txt.text, requestHandler, params);
}else if (requestMethod == "DELETE") {//當選擇DELETE時
  Facebook.deleteObject(apiRequest_txt.text, requestHandler);
}else {//其他,也就是選GET時
  params = JSON.decode(params_txt.text);
  Facebook.api(apiRequest_txt.text, requestHandler, params, method_cb.selectedLabel);
}
應該很簡單,就是依照method_cb這個ComboBox所選擇的request method,來決定用哪一種method。而requestHandler用來處理回傳的結果:
private function requestHandler(result:Object, fail:Object):void 
{
  if (result != null)
  {
      if (result.error_msg != null)
      {
        result_txt.text = result.error_msg;
      }else{
        result_txt.text = JSON.encode(result);
      }
  }
  if (fail != null)
  {
    result_txt.text = JSON.encode(fail);
  }
}
即使result不為null,如果裡面帶有error_msg的話,表示有錯誤,必須另外處理。
result可能是Array、Object、Boolean等等,所以將它再轉為JSON encoded的String來顯示比較省事,實際應用時就應該針對不同資料型態去處理。

測試
為什麼之前要先寫一篇Graph API的基礎知識?就是因為如果不先了解Graph API的呼叫方式,這邊即使知道有這些method也沒用啦。GET資料比較單純,Search與限制欄位前面也有介紹要怎麼用,另外也可以試試limit與offset喔。POST可以試試前面介紹的/me/feed,然後將回傳的post id值複製下來,先回Facebook看看應該會找到這個訊息,然後回來試試用DELETE,將post id貼到第一個欄位,前面加斜線,刪掉剛剛那個post。Graph API提供哪些Object可以查詢,各需要哪些extended permission,這就需要大家多翻翻文件了。這個App.就可以就來測試用,當有些查詢是很常用的,就可以試著自己將它寫成一套lib.,或者配合視覺元件製作成component,這樣就不用每次都去湊那些request啦。

上一篇文章:Facebook ActionScript Graph API ( 1 ) 取得認證與授權,以及登入
下一篇文章:Facebook ActionScript Graph API ( 3 ) FQL、Old REST API以及picture

4 則留言:

  1. 嗚!不知道是不是我的問題。
    用api下"/me",並設params
    {"fields":["id","name","gender","locale"]}
    結果只會抓到id和locale。

    如果改成
    {"fields":["id","name","gender"]}
    結果只有id和gender

    = x = ... 這算是bug嗎?

    回覆刪除
  2. To EastMoon:
    fields後面應該給字串而不是Array.....把[ ] 拿掉應該就可以了

    回覆刪除
  3. {"fields":"id,name,gender,locale"}
    這樣合併成一個字串,用逗號隔開

    回覆刪除
  4. = x =|| ... 無言,這看起來就像是個陣列。
    改好後,已經沒問題了。

    回覆刪除