[OpenSocial] AppData.update 実装中。

全国行脚の一環で、故郷の新潟にやってきています。新米のおいしい季節になりました。

さて、Sticky ガジェットを実装してOSCでデモするぜ!と意気込んだものの、さくっとつくったら、AppData.update をうちのOpenSocialコンテナ(CouchDB)がMethod Not Allowed を返しやがりました。OpenSocial のSPEC上P0(必須)ではなかったので(v0.8のtest suite, v0.9だとどうなんだろう)、実装していなかったみたいです。

でもgetが必須でupdateが必須じゃないって仕様としてどうなんだ。という話で結構OpenSocialの仕様は、混沌としている気がします。ひとまずAppData.update の仮バージョンを実装してcommit/pushしておきました。後でちゃんと直す予定(このままだとConflictが発生するので)。

それはともかくAppDataで気がついたこと。


OpenSocial の日本語情報はたくさんあるので、Google先生はそちらを帰してくれます。

http://gihyo.jp/dev/serial/01/opensocial/0005?page=2

req.add(req.newUpdatePersonAppDataRequest(
    opensocial.IdSpec.PersonId.VIEWER, 'id', id), 'self');

これは OpenSocial v0.8 の仕様のようです。twitterで教えていただきました。v 0.9 では、

req.add(req.newUpdatePersonAppDataRequest('key', value), 'rpc_key');

が正しい模様。あれ、誰のデータか?の情報が消えたw shindig の実装を見ると userId: @viewer でJSON-RPCを飛ばす模様。

一方で、getのほうは、

req.add(req.newFetchPersonAppDataRequest(params, key), 'selfAppdata');

で、params 部分にuserIdとかgroupIdとかいれられます。これはv0.8とv0.9で変化なし。。。

なんで非対称なの。AppData は他人のは参照できても更新はできない、という考え方はわからなくもないけれど。。。でもJSON-RPC/RESTの両方とも、update時にuserIdを指定することができるプロトコル仕様にはなっているので、どう考えてもJavaScript APIの仕様の方が間違っている気がする。

http://wiki.opensocial.org/index.php?title=OSAPI_Specification#osapi.appdata の osapi のほうを確認したら、こちらはJavaScript APIでudpate時にもuserIdを指定できるらしい。


あと、全然関係ないが get するときに、「userId: @me, groupId: @friends, keys: [k1,k2,..] ってやったら返値は [v1,v2,...] じゃなくて {u1: [v1,v2,...], u2: [v1,v2, ...] } じゃね?どうやってクライアント側でユーザー毎のデータを識別するの?」というのをSPEC ML側に投げておいたら「それは議論中だ」といわれたので、確認してみたら、今のv0.9の仕様では {u1: [v1, v2,...], u2: [v1, v2,...], ..} の形式になっていました。それまでの議論の流れ的に放置してても、ちゃんとこうなりそうな雰囲気だったのでなんにもフォローしてなかったや。

ひさびさにOpenSocialと遊んだ数時間。