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

2009年7月23日木曜日

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

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

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


<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="Activity">
<Require feature="opensocial-0.8" />
</ModulePrefs>
<Content type="html" view="home,profile,canvas">
<![CDATA[
<script type="text/javascript">
function get() {
/*===================================================================*/
/* OWNER IdSpec */
/*===================================================================*/
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);

/*===================================================================*/
/* DataRequestオブジェクトを作成し、 */
/* そこにActivity取得リクエストを追加. */
/* レスポンスを取得するときのキーは'get_activity' */
/*===================================================================*/
var req = opensocial.newDataRequest();
req.add(req.newFetchActivitiesRequest(idspec), 'get_activity');
/*===================================================================*/
/* 送信! */
/*===================================================================*/
req.send(function(response){
var activity = response.get('get_activity')
if (activity.hadError()) {
document.getElementById('result').innerHTML
= 'エラーだったよ:' + activity.getErrorMessage();
return;
}
var out = document.createElement('ul');
var li = document.createElement('li');
if (activity.getData().size() == 0) {
li.innerHTML = 'Activity0件';
out.appendChild(li);
}
activity.getData().each(function(act) {
var title = act.getField(opensocial.Activity.Field.TITLE);
var media = act.getField(opensocial.Activity.Field.MEDIA_ITEMS);
if (media != undefined) {
for (var ii=0, len = media.length; ii < len; ii++) {
if (media[ii].getField(opensocial.MediaItem.Field.TYPE) == opensocial.MediaItem.Type.IMAGE) {
title +=
'<br /><img src="'
+ media[ii].getField(opensocial.MediaItem.Field.URL);
+ '/>';
}
}
}
li.innerHTML = title;
out.appendChild(li);
});

document.getElementById('result').appendChild(out);
});
}
function update() {
var params = {};
params[opensocial.Activity.Field.TITLE] = 'アクティビティテストです';
/*===================================================================*/
/* Activity作成 */
/*===================================================================*/
var act = opensocial.newActivity(params);
/*===================================================================*/
/* 送信 */
/*===================================================================*/
opensocial.requestCreateActivity(act, opensocial.CreateActivityPriority.HIGH, callback);

function callback(status){
if (status.hadError()) {
document.getElementById('result').innerHTML = 'Activity更新失敗';
return;
}
document.getElementById('result').innerHTML = 'Activity更新成功';
};
};

function media() {
var opt_params = {};
opt_params[opensocial.MediaItem.Field.TYPE] = opensocial.MediaItem.Type.IMAGE;
var mediaItem = opensocial.newMediaItem(
'image/gif',
'http://www.google.co.jp/intl/ja_jp/images/logo.gif',
opt_params
);
var params = {};
params[opensocial.Activity.Field.TITLE] = 'MediaItemを使ったアクティビティテストです';
params[opensocial.Activity.Field.MEDIA_ITEMS] = [mediaItem];
var act = opensocial.newActivity(params);
opensocial.requestCreateActivity(act, opensocial.CreateActivityPriority.HIGH, callback);

function callback(status){
if (status.hadError()) {
document.getElementById('result').innerHTML = 'Activity更新失敗 With MediaItemType';
return;
}
document.getElementById('result').innerHTML = 'Activity更新成功 With MediaItemType';
};
}
</script>
<div id="result"></div>
<input type="button" value="アクティビティを取得する" onclick="get();" /><br />
<input type="button" value="アクティビティを更新する" onclick="update();" /><br />
<input type="button" value="MediaItemを使ってアクティビティを更新する" onclick="media();" /><br />
]]>
</Content>
</Module>


な感じ。

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

で、「アクティビティを更新する」ボタンを押下。
そのときのFirebugの出力は、

[
{
"method":"activities.create",
"params":{
"userId":["@viewer"],
"groupId":"@self",
"appId":"@app",
"activity":{
"title":"アクティビティテストです",
"mediaItems":[]
}
},
"id":"key"
}
]

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

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

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

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

.

0 コメント: