Atom で件数取得
» Permanent link | |
なんか催促されちゃったみたいなので :-) 詳しく書いてみます。
はてなのブックマーク件数取得 API いいですね。 今さら xml-rpc かよ! というツッコミは置いておいて、 データ重要な世の中で有用なコンテンツ(メタデータ)にリーチする 方法が増えるのは喜ばしいことです。
そうそう、こういう API を AtomPP で実装するとしたらどんな感じなんだろう。そもそもうまくフィードで定義できるのか。教えて偉い人!
偉い人じゃないけど、結論からいえば、 Atom Publishing Protocol (APP) そのままじゃ無理です。 やってもいいけどどうしても無理が出てしまいそう。 そもそも目的が違うのだから、ここは野良 XML/プロトコルでいいのでは。 ただ、結果をフィードで取れるとそれなりに嬉しいかもしれない。
普通 REST で検索するときは query string を使った URI を GET することになる(検索結果リソースを GET する)んですが、 今回の場合のようにパラメータがたくさんあったり長かったりする場合は GET は現実的ではありません。 こういうときは問合せ文書(query document)を POST で投げます。
POST /atom/exist HTTP/1.1 Host: b.hatena.ne.jp Content-Type: application/xml Content-Length: xxx <uri-list xmlns="http://ns.hatena.ne.jp/uri-list"> <uri>http://d.hatena.ne.jp/naoya/20051212</uri> <uri>http://yohei-y.blogspot.com</uri> </uri-list>
結果はたとえば XML 形式で取れます。
HTTP/1.1 201 Credated Host: b.hatena.ne.jp Content-Type: application/xml Content-Length: xxx Location: http://b.hatena.ne.jp/atom/exist/1234567890abcdefg <bookmark-list xmlns="http://ns.hatena.ne.jp/bookmark"> <bookmark> <uri>http://d.hatena.ne.jp/naoya/20051212</uri> <count>5</count> </bookmark> <bookmark> <uri>http://yohei-y.blogspot.com</uri> <count>4</count> </bookmark> </bookmark-list>
ここでのキモは Location ヘッダで検索結果リソースの URI を返しているところ。 この URI を GET すればいつでもこの検索結果(の最新版)が取得できると。
リクエストとレスポンスは野良 XML でもいいんですが、これくらいの情報なら JSON の方がプログラムから扱いやすくて便利ですよね。実際、グリモンとかから使うなら JSON の方がいいと僕も思います。
ただ、レスポンスの場合、野良 XML じゃなくて Atom フィードだと いいことありそうです。
HTTP/1.1 201 Created Host: b.hatena.ne.jp Content-Type: application/atom+xml Content-Length: xxx Location: http://b.hatena.ne.jp/atom/exist/1234567890abcdefg <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <title>はてなブックマーク検索結果</title> <link rel="self" type="application/atom+xml" href="http://b.hatena.ne.jp/atom/exist/1234567890abcdefg"/> <updated>2003-12-13T18:30:02Z</updated> <author><name>Hatena</name></author> <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id> <entry> <title>なおやのはてなダイアリー</title> <link href="http://d.hatena.ne.jp/naoya/20051212"/> <link rel="alternate" href="http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/naoya/20051212"/> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2005-12-13T18:30:02Z</updated> <summary>5</summary> <content type="xhtml"> <!-- リンク、キーワード、タグなんかをそのまま入れる --> </content> </entry> <entry> <title>yohei-y:weblog</title> <link href="http://yohei-y.blogspot.com"/> <link rel="alternate" href="http://b.hatena.ne.jp/entry/http://yohei-y.blogspot.com"/> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2005-12-10T10:34:02Z</updated> <summary>4</summary> <content type="xhtml"> <!-- リンク、キーワード、タグなんかをそのまま入れる --> </content> </entry> </feed>
ブックマーク件数は summary に入れるの? とか(summary/content の中で microformats 的にやったほうがいいかもしれない)、いろいろツッコミどころはありますが、雰囲気は伝わるんじゃないでしょうか。
イメージとしては、現在の人間用はてなブックマーク一覧のページで、 表示するブックマークを一つ一つ指定できるようにした感じです。 今のブックマーク一覧ページで取れている情報をそのまま Atom フィードにしたものを想像してもらえればいいでしょう。 カテゴリなど、Atom で用意されている要素はそのまま使ってもよさそうだし、 足りない要素・属性があればはてなの名前空間で足せばいいだけ。
Atom フィードなんで、RSS リーダで購読すれば更新情報も取れます。 自分の気になる記事がどれくらいブックマークされてるかどうか気になる人には けっこう嬉しいんじゃないでしょうか。
まー、フィードは Atom じゃなくて RSS でもいいじゃん、 といわれちゃいそうだけど、RESTful に考えるとこんな風になるという参考までに。
追記: 例のレスポンスのステータスコードを 201 にしました。