AtomPP でタグの編集に関するつぶやき
思考がまとまらないまま少しつぶやいてみます。
はてなブックマークの API の拡張の実装をぼちぼちやってます。フィードにページングの機能を付けて過去のフィードを取得できるようにしたり、タグで絞り込んだフィードが取得できるようにしたりといったところは実装済みです。
以前に Atomフィード内のタグはどう表現するかというところで、dc:subject か category か、と思ったのですが現在はてなブックマークで利用している IETF ドラフト以前の仕様では category 要素はないし、既存のクライアントやAtomPP 側との整合性を考えるとドラフト版に移行するのは早計、と見て dc:subject で表現しています。
... <entry> <title>はてなブックマーク</title> <link rel="related" type="text/html" href="..." /> <link rel="alternate" type="text/html" href="..." /> <link rel="service.edit" type="application/x.atom+xml" href="..." title="..." /> <issued>2005-06-30T20:22:00+09:00</issued> <author> <name>naoya</name> </author> <id>tag:hatena.ne.jp,2005:bookmark-naoya-1234</id> <summary type="text/plain">ほげほげ</summary> <dc:subject>hatena</dc:subject> <dc:subject>bookmark</dc:subject> </entry> ...
といった具合です。
それから、タグの一括置換のインタフェースも実装済みです。これに合わせてAPIも作ろうと思ったところでちょっと悩み事が出てきました。
del.icio.us の API ではタグの一括置換も可能なのですが、del.icio.us API は Basic認証 + 独自XML なので、自社のサービスに特化したシンプルな API になってます。一方、はてなブックマークの方は AtomPP を採用してます。
ブックマークの投稿(POST)、編集(EDIT)、削除(DELETE)なんかはデータ構造的にちゃんとエントリーになってて分かりやすかったのですが、問題はタグをリソースと見立てて編集するとき。リソースとしてタグを中心に添えた場合に、Atomフィードでタグを表現するのがどうしたものか良く分かりません。
つまり、タグの一括置換機能を AtomPP で実現しようとしたときに EditURI に対して PUT するとき送りつける XML 文書のフォーマットはどんな風になるのか、という所です。
TypePad の AtomAPI で、TypeList にリストを放り投げる場合は以下のようなフィードを POST しています。(TypePad AtomAPI より)
POST /t/atom/lists/list_id=1 HTTP/1.1 Host: www.typepad.com X-WSSE: my credentials <?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://purl.org/atom/ns#" xmlns:book="..." xmlns:rvw="..."> <book:isbn>0375412808</book:isbn> <content>This is a funny book.</content> <rvw:value>4</rvw:value> </entry>
このフィードの構造は、Atomフィードの仕様に照らし合わせると必須に指定されている title 要素や link 要素がないのですが、AtomPP の中ではそれもありなのかなあ? だとすると、/atom/tag/bookmark とかに
<entry> <dc:subject>hatena</dc:subject> </entry>
とか PUT してやると bookmark タグ → hatena タグに一括置換するような仕様もアリなのかなという気になってくるのですが。
あとは、タグ一覧を取得する API。AtomPP 的には FeedURI で実現するとして、GET で
<entry> <dc:subject>atom</dc:subject> <dc:subject>bookmark</dc:subject> <dc:subject>hatena</dc:subject> ... </entry>
とか返ってくるようにする? タグの利用回数や最終利用時刻なんかも含めたいのだけど、その場合は attribute で表現するとして dc:subject には追加できないし...。とか考えてると、
<entry> <title>blog</title> <link rel="alternate" type="text/html" href="http://b.hatena.ne.jp/naoya/blog/" /> <link rel="service.edit" type="application/x.atom+xml" href="..." /> <hatena:bmcount>2</hatena:bmcount> <hatena:bmtimestamp>2005-06-30:20:41:00</hatena:bmtimestamp> </entry> <entry> <title>hatena</title> ...
とかかなとか。
なんて色々と考えてると Atom で全部実現するのが大変な気がしてきました。このあたりをしっかり仕様の範囲内でまとめられるかどうか、試行錯誤中です。詳しい方、お、教えてください。