yohei-y:weblog

XML と REST/Web サービス関連の話題が中心の weblog です

2005年12月12日

Atom で件数取得

» Permanent link | はてなブックマーク | livedoor clip

なんか催促されちゃったみたいなので :-) 詳しく書いてみます。

はてなのブックマーク件数取得 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月13日T18: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月13日T18: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月10日T10:34:02Z</updated>
 <summary>4</summary>
 <content type="xhtml">
 <!-- リンク、キーワード、タグなんかをそのまま入れる -->
 </content>
 </entry>
</feed>

ブックマーク件数は summary に入れるの? とか(summary/content の中で microformats 的にやったほうがいいかもしれない)、いろいろツッコミどころはありますが、雰囲気は伝わるんじゃないでしょうか。

イメージとしては、現在の人間用はてなブックマーク一覧のページで、 表示するブックマークを一つ一つ指定できるようにした感じです。 今のブックマーク一覧ページで取れている情報をそのまま Atom フィードにしたものを想像してもらえればいいでしょう。 カテゴリなど、Atom で用意されている要素はそのまま使ってもよさそうだし、 足りない要素・属性があればはてなの名前空間で足せばいいだけ。

Atom フィードなんで、RSS リーダで購読すれば更新情報も取れます。 自分の気になる記事がどれくらいブックマークされてるかどうか気になる人には けっこう嬉しいんじゃないでしょうか。

まー、フィードは Atom じゃなくて RSS でもいいじゃん、 といわれちゃいそうだけど、RESTful に考えるとこんな風になるという参考までに。

追記: 例のレスポンスのステータスコードを 201 にしました。

ラベル: ,

posted by yohei @ 23:35 0 comments

shinobi.jp

AltStyle によって変換されたページ (->オリジナル) /