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

2009年7月24日金曜日

[Apache Shindig][お勉強][OpenSocial] メモ82 DataRequest.newFetchActivitiesRequest時のopt_paramに指定できるもの

newFetchActivitiesRequest発行時のサーバ側の処理は3のメソッドにそれぞれ分岐するところ
までは分かった。

さて、分岐させるべく、Gadget側でいろいろなパラメータでnewFetchActivitiesRequestをコールしてみたいよ。

OpenSocial0.8.1のAPIリファレンスを見ると、


Object newFetchActivitiesRequest(idSpec, opt_params)
サーバーからアクティビティ ストリームを要求するアイテムを作成します。

と書いてある。
他のnewFetchシリーズと同様に第二引数でいろいろと指定できそう。

このopt_paramsに何を指定することができるかってーと、

features/opensocial-reference/datarequest.js

を見てみると書いてあった。
  1. opensocial.DataRequest.ActivityRequestFields = {  
  2.   /** 
  3.    * {String} If provided will filter all activities by this app Id. 
  4.    * @private - at the moment you can only request activities for your own app 
  5.    */  
  6.   APP_ID : 'appId',  
  7.   /** 
  8.    * When paginating, the index of the first item to fetch. 
  9.    * Specified as a <code>Number</code>. 
  10.    * 
  11.    * @member opensocial.DataRequest.ActivityRequestFields 
  12.    */  
  13.   FIRST : 'first',  
  14.   
  15.   /** 
  16.    * The maximum number of items to fetch; defaults to 20. If set to a larger 
  17.    * number, a container may honor the request, or may limit the number to a 
  18.    * container-specified limit of at least 20. 
  19.    * Specified as a <code>Number</code>. 
  20.    * 
  21.    * @member opensocial.DataRequest.ActivityRequestFields 
  22.    */  
  23.   MAX : 'max'  
  24. };  

だって。
maxとfirstとappIdと。


maxとfirstは指定しないと、firstには0が、maxには20がセットされる。
  1. opensocial.DataRequest.prototype.newFetchActivitiesRequest = function(idSpec,  
  2.     opt_params) {  
  3.   opt_params = opt_params || {};  
  4.   
  5.   var fields = opensocial.DataRequest.ActivityRequestFields;  
  6.   
  7.   this.addDefaultParam(opt_params, fields.FIRST, 0);  
  8.   this.addDefaultParam(opt_params, fields.MAX, 20);  
  9.   
  10.   return opensocial.Container.get().newFetchActivitiesRequest(idSpec,  
  11.       opt_params);  
  12. };  

ほら。


あれ?activityIdは???
activityIdはjsonrpccontainer.jsの方で指定しているのか、
と思いきや、書いてない。。
どうも、Shindigのサンプル実装だとactivityIdは渡せないっぽい。

ということで、features/opensocial-jsonrpc/jsonrpccontainer..jsを修正。
  1. JsonRpcContainer.prototype.newFetchActivitiesRequest = function(idSpec,  
  2.     opt_params) {  
  3.   var rpc = { method : "activities.get" };  
  4.   rpc.params = this.translateIdSpec(idSpec);  
  5.   rpc.params.appId = "@app";  
  6.   FieldTranslations.translateStandardArguments(opt_params, rpc.params);  
  7.   FieldTranslations.translateNetworkDistance(idSpec, rpc.params);  
  8.   
  9.   return new JsonRpcRequestItem(rpc,  
  10.       function(rawJson) {  
  11.         rawJson = rawJson['list'];  
  12.         var activities = [];  
  13.         for (var i = 0; i < rawJson.length; i++) {  
  14.           activities.push(new JsonActivity(rawJson[i]));  
  15.         }  
  16.         return new opensocial.Collection(activities);  
  17.       });  
  18. };  


  1. JsonRpcContainer.prototype.newFetchActivitiesRequest = function(idSpec,  
  2.     opt_params) {  
  3.   var rpc = { method : "activities.get" };  
  4.   rpc.params = this.translateIdSpec(idSpec);  
  5.   rpc.params.appId = "@app";  
  6.   /* ここから */  
  7.   if (opt_params['activityId']) {  
  8.     rpc.params.activityId = opt_params['activityId'];  
  9.   }  
  10.   /* ここまで */  
  11.   FieldTranslations.translateStandardArguments(opt_params, rpc.params);  
  12.   FieldTranslations.translateNetworkDistance(idSpec, rpc.params);  
  13.   
  14.   return new JsonRpcRequestItem(rpc,  
  15.       function(rawJson) {  
  16.         /* さらに修正 ここから */  
  17.         if (rawJson['list']) {  
  18.           rawJson = rawJson['list'];  
  19.         }  
  20.         else {  
  21.           rawJson = [rawJson];  
  22.         }  
  23.         /* さらに修正 ここまで */  
  24.         var activities = [];  
  25.         for (var i = 0; i < rawJson.length; i++) {  
  26.           activities.push(new JsonActivity(rawJson[i]));  
  27.         }  
  28.         return new opensocial.Collection(activities);  
  29.       });  
  30. };  

に修正。


さらに、GadgetXMLも
  1. var idspec = new opensocial.IdSpec();  
  2. idspec.setField(opensocial.IdSpec.Field.USER_ID,  opensocial.IdSpec.PersonId.OWNER);  
  3. idspec.setField(opensocial.IdSpec.Field.GROUP_ID, opensocial.IdSpec.GroupId.SELF);  
  4. var params = {};  
  5. params['activityId'] = '6ng0wgx0lgb0nxc0t9t02ur03bw0hcx0';  
  6.   
  7. /*===================================================================*/  
  8. /* DataRequestオブジェクトを作成し、                                 */  
  9. /* そこにActivity取得リクエストを追加.                               */  
  10. /* レスポンスを取得するときのキーは'get_activity'                    */  
  11. /*===================================================================*/  
  12.   
  13. var req = opensocial.newDataRequest();  
  14. req.add(req.newFetchActivitiesRequest(idspec, params), 'get_activity');  

として実行。

ばっちりサーバ側でactivityIdを受け取れる。
これでサーバ側3処理にそれぞれ処理を投げることができるようになった。

あと、サーバ側インタフェースを見ると、fieldsも指定できるようなシグネチャに
なっているんだけど、今のところ意図的に無視している。
なので、そこはそのまま。

さて、つづき。

--
レスポンスが返ってくるようになったけど、JsonRpcRequestItemの第二引数が
だめだったので追加で修正。

--
結局のところ、newFetchActivitiesRequestの第二引数で指定できるものは、
Shindigそのままのjsonrpccontainer.jsのサンプル実装だと、
* appId
* max
* first
サーバ側のサンプル実装だと、上記に加えて
* activityId
ぐらいか。な?




.

0 コメント: