newFetchActivitiesRequest発行時のサーバ側の処理は3のメソッドにそれぞれ分岐するところ
までは分かった。
さて、分岐させるべく、Gadget側でいろいろなパラメータでnewFetchActivitiesRequestをコールしてみたいよ。
OpenSocial0.8.1のAPIリファレンスを見ると、
Object newFetchActivitiesRequest(idSpec, opt_params)
サーバーからアクティビティ ストリームを要求するアイテムを作成します。
と書いてある。
他のnewFetchシリーズと同様に第二引数でいろいろと指定できそう。
このopt_paramsに何を指定することができるかってーと、
features/opensocial-reference/datarequest.js
を見てみると書いてあった。
opensocial.DataRequest.ActivityRequestFields = {
/**
* {String} If provided will filter all activities by this app Id.
* @private - at the moment you can only request activities for your own app
*/
APP_ID : 'appId',
/**
* When paginating, the index of the first item to fetch.
* Specified as a <code>Number</code>.
*
* @member opensocial.DataRequest.ActivityRequestFields
*/
FIRST : 'first',
/**
* The maximum number of items to fetch; defaults to 20. If set to a larger
* number, a container may honor the request, or may limit the number to a
* container-specified limit of at least 20.
* Specified as a <code>Number</code>.
*
* @member opensocial.DataRequest.ActivityRequestFields
*/
MAX : 'max'
};
だって。
maxとfirstとappIdと。
maxとfirstは指定しないと、firstには0が、maxには20がセットされる。
opensocial.DataRequest.prototype.newFetchActivitiesRequest = function(idSpec,
opt_params) {
opt_params = opt_params || {};
var fields = opensocial.DataRequest.ActivityRequestFields;
this.addDefaultParam(opt_params, fields.FIRST, 0);
this.addDefaultParam(opt_params, fields.MAX, 20);
return opensocial.Container.get().newFetchActivitiesRequest(idSpec,
opt_params);
};
ほら。
あれ?activityIdは???
activityIdはjsonrpccontainer.jsの方で指定しているのか、
と思いきや、書いてない。。
どうも、Shindigのサンプル実装だとactivityIdは渡せないっぽい。
ということで、features/opensocial-jsonrpc/jsonrpccontainer..jsを修正。
JsonRpcContainer.prototype.newFetchActivitiesRequest = function(idSpec,
opt_params) {
var rpc = { method : "activities.get" };
rpc.params = this.translateIdSpec(idSpec);
rpc.params.appId = "@app";
FieldTranslations.translateStandardArguments(opt_params, rpc.params);
FieldTranslations.translateNetworkDistance(idSpec, rpc.params);
return new JsonRpcRequestItem(rpc,
function(rawJson) {
rawJson = rawJson['list'];
var activities = [];
for (var i = 0; i < rawJson.length; i++) {
activities.push(new JsonActivity(rawJson[i]));
}
return new opensocial.Collection(activities);
});
};
を
JsonRpcContainer.prototype.newFetchActivitiesRequest = function(idSpec,
opt_params) {
var rpc = { method : "activities.get" };
rpc.params = this.translateIdSpec(idSpec);
rpc.params.appId = "@app";
/* ここから */
if (opt_params['activityId']) {
rpc.params.activityId = opt_params['activityId'];
}
/* ここまで */
FieldTranslations.translateStandardArguments(opt_params, rpc.params);
FieldTranslations.translateNetworkDistance(idSpec, rpc.params);
return new JsonRpcRequestItem(rpc,
function(rawJson) {
/* さらに修正 ここから */
if (rawJson['list']) {
rawJson = rawJson['list'];
}
else {
rawJson = [rawJson];
}
/* さらに修正 ここまで */
var activities = [];
for (var i = 0; i < rawJson.length; i++) {
activities.push(new JsonActivity(rawJson[i]));
}
return new opensocial.Collection(activities);
});
};
に修正。
さらに、GadgetXMLも
var idspec = new opensocial.IdSpec();
idspec.setField(opensocial.IdSpec.Field.USER_ID, opensocial.IdSpec.PersonId.OWNER);
idspec.setField(opensocial.IdSpec.Field.GROUP_ID, opensocial.IdSpec.GroupId.SELF);
var params = {};
params['activityId'] = '6ng0wgx0lgb0nxc0t9t02ur03bw0hcx0';
/*===================================================================*/
/* DataRequestオブジェクトを作成し、 */
/* そこにActivity取得リクエストを追加. */
/* レスポンスを取得するときのキーは'get_activity' */
/*===================================================================*/
var req = opensocial.newDataRequest();
req.add(req.newFetchActivitiesRequest(idspec, params), 'get_activity');
として実行。
ばっちりサーバ側でactivityIdを受け取れる。
これでサーバ側3処理にそれぞれ処理を投げることができるようになった。
あと、サーバ側インタフェースを見ると、fieldsも指定できるようなシグネチャに
なっているんだけど、今のところ意図的に無視している。
なので、そこはそのまま。
さて、つづき。
--
レスポンスが返ってくるようになったけど、JsonRpcRequestItemの第二引数が
だめだったので追加で修正。
--
結局のところ、newFetchActivitiesRequestの第二引数で指定できるものは、
Shindigそのままのjsonrpccontainer.jsのサンプル実装だと、
* appId
* max
* first
サーバ側のサンプル実装だと、上記に加えて
* activityId
ぐらいか。な?
.
0 コメント:
コメントを投稿