メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2009年7月23日木曜日

[Apache Shindig][お勉強][OpenSocial] メモ77 opensocial.requestCreateActivityのサーバ側実装をしてみる(1)

requestCreateActivityを使ってサーバにActivityを保存する。
requestCreateActivityに対応するサーバ側の処理を実装してみる。

テストで使用するGadget XMLは、goo ディベロッパーキッチンのサンプルを参考に作成。

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <Module>  
  3.   <ModulePrefs title="Activity">  
  4.     <Require feature="opensocial-0.8" />  
  5.   </ModulePrefs>  
  6.   <Content type="html" view="home,profile,canvas">  
  7.     <![CDATA[ 
  8.     <script type="text/javascript"> 
  9.       function get() { 
  10.         /*===================================================================*/ 
  11.         /* OWNER IdSpec                                                      */ 
  12.         /*===================================================================*/ 
  13.         var idspec = new opensocial.IdSpec(); 
  14.         idspec.setField(opensocial.IdSpec.Field.USER_ID,  opensocial.IdSpec.PersonId.OWNER); 
  15.         idspec.setField(opensocial.IdSpec.Field.GROUP_ID, opensocial.IdSpec.GroupId.SELF); 
  16.  
  17.         /*===================================================================*/ 
  18.         /* DataRequestオブジェクトを作成し、                                 */ 
  19.         /* そこにActivity取得リクエストを追加.                               */ 
  20.         /* レスポンスを取得するときのキーは'get_activity'                    */ 
  21.         /*===================================================================*/ 
  22.         var req = opensocial.newDataRequest(); 
  23.         req.add(req.newFetchActivitiesRequest(idspec), 'get_activity'); 
  24.         /*===================================================================*/ 
  25.         /* 送信!                                                             */ 
  26.         /*===================================================================*/ 
  27.         req.send(function(response){ 
  28.           var activity = response.get('get_activity') 
  29.           if (activity.hadError()) { 
  30.             document.getElementById('result').innerHTML 
  31.               = 'エラーだったよ:' + activity.getErrorMessage(); 
  32.             return; 
  33.           } 
  34.           var out = document.createElement('ul'); 
  35.           var li = document.createElement('li'); 
  36.           if (activity.getData().size() == 0) { 
  37.             li.innerHTML = 'Activity0件'; 
  38.             out.appendChild(li); 
  39.           } 
  40.           activity.getData().each(function(act) { 
  41.             var title = act.getField(opensocial.Activity.Field.TITLE); 
  42.             var media = act.getField(opensocial.Activity.Field.MEDIA_ITEMS); 
  43.             if (media != undefined) { 
  44.               for (var ii=0, len = media.length; ii < len; ii++) { 
  45.                 if (media[ii].getField(opensocial.MediaItem.Field.TYPE) == opensocial.MediaItem.Type.IMAGE) { 
  46.                   title += 
  47.                       ' 
  48. <img src="' 
  49.                     + media[ii].getField(opensocial.MediaItem.Field.URL); 
  50.                     + '/>'; 
  51.                 } 
  52.               } 
  53.             } 
  54.             li.innerHTML = title; 
  55.             out.appendChild(li); 
  56.           }); 
  57.  
  58.           document.getElementById('result').appendChild(out); 
  59.         }); 
  60.       } 
  61.       function update() { 
  62.         var params = {}; 
  63.         params[opensocial.Activity.Field.TITLE] = 'アクティビティテストです'; 
  64.         /*===================================================================*/ 
  65.         /* Activity作成                                                      */ 
  66.         /*===================================================================*/ 
  67.         var act = opensocial.newActivity(params); 
  68.         /*===================================================================*/ 
  69.         /* 送信                                                              */ 
  70.         /*===================================================================*/ 
  71.         opensocial.requestCreateActivity(act, opensocial.CreateActivityPriority.HIGH, callback); 
  72.  
  73.         function callback(status){ 
  74.           if (status.hadError()) { 
  75.             document.getElementById('result').innerHTML = 'Activity更新失敗'; 
  76.             return; 
  77.           } 
  78.           document.getElementById('result').innerHTML = 'Activity更新成功'; 
  79.         }; 
  80.       }; 
  81.  
  82.       function media() { 
  83.         var opt_params = {}; 
  84.         opt_params[opensocial.MediaItem.Field.TYPE] = opensocial.MediaItem.Type.IMAGE; 
  85.         var mediaItem = opensocial.newMediaItem( 
  86.           'image/gif', 
  87.           'http://www.google.co.jp/intl/ja_jp/images/logo.gif', 
  88.           opt_params 
  89.         ); 
  90.         var params = {}; 
  91.         params[opensocial.Activity.Field.TITLE] = 'MediaItemを使ったアクティビティテストです'; 
  92.         params[opensocial.Activity.Field.MEDIA_ITEMS] = [mediaItem]; 
  93.         var act = opensocial.newActivity(params); 
  94.         opensocial.requestCreateActivity(act, opensocial.CreateActivityPriority.HIGH, callback); 
  95.  
  96.         function callback(status){ 
  97.           if (status.hadError()) { 
  98.             document.getElementById('result').innerHTML = 'Activity更新失敗 With MediaItemType'; 
  99.             return; 
  100.           } 
  101.           document.getElementById('result').innerHTML = 'Activity更新成功 With MediaItemType'; 
  102.         }; 
  103.       } 
  104.     </script> 
  105.     <div id="result"></div> 
  106.     <input type="button" value="アクティビティを取得する" onclick="get();" /> 
  107.  
  108.     <input type="button" value="アクティビティを更新する" onclick="update();" /> 
  109.  
  110.     <input type="button" value="MediaItemを使ってアクティビティを更新する" onclick="media();" /> 
  111.  
  112.     ]]>  
  113.   </Content>  
  114. </Module>  

な感じ。

サンプルによると、「MediaItemを使ったアクティビティ更新」というものも存在するらしい。

で、「アクティビティを更新する」ボタンを押下。
そのときのFirebugの出力は、
  1. [  
  2.   {  
  3.     "method":"activities.create",  
  4.     "params":{  
  5.        "userId":["@viewer"],  
  6.        "groupId":"@self",  
  7.        "appId":"@app",  
  8.        "activity":{  
  9.          "title":"アクティビティテストです",  
  10.          "mediaItems":[]  
  11.        }  
  12.      },  
  13.      "id":"key"  
  14.   }  
  15. ]  

となっている。
見難いので整形済み。

UserIdは複数指定できる。
GroupIdはサーバ側サンプル実装によると、見ていないので、どうしたものか。
@appはサーバ側でガジェットのURLに変換される。

どうも、requestCreateActivityを使うと、レスポンス取得キーは'key'になるらしい。

気になるところはGroupIdとUserId。
@friendsとか指定されたらどうなるんだろう。。

.

0 コメント: