[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と遊んだ数時間。