Atom API のサーバ側をちょっといじくってるこの頃(というか今日見始めたばかりですが)。気になってきたことをメモです。
Atom API はBlog の XML-RPC まわりのために立ち上がったプロジェクトではありますが、仕様自体は拡張性があるので、別にBlogに限った用途なわけではありません。実際、TypePad の Atom API では、Blog 以外に TypeList や PhotoAlbum の編集を同様のAPIで処理することができます。
たとえば TypeList に書籍を追加するには、
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="http://sixapart.com/atom/book#" xmlns:rvw="http://purl.org/NET/RVW/0.1/"> <book:isbn>0375412808</book:isbn> <content>This is a funny book.</content> <rvw:value>4</rvw:value> </entry>
のようなリクエストを投げ、
HTTP/1.1 201 Created Content-Type: application/x.atom+xml <?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://purl.org/atom/ns#" xmlns:book="http://sixapart.com/atom/book#" xmlns:rvw="http://purl.org/NET/RVW/0.1/"> <title>Jeffrey Steingarten: It Must've Been Something I Ate: The Return of the Man Who Ate Everything</title> <issued>2003-12-05T00:21:54Z</issued> <id>tag:typepad.com,2003:listitem-201</id> <book:title>It Must've Been Something I Ate: The Return of the Man Who Ate Everything</book:title> <book:author>Jeffrey Steingarten</book:author> <content>This is a funny book.</content> <rvw:value>4</rvw:value> <book:isbn>0375412808</book:isbn> <book:thumbnail>http://images.amazon.com/images/P/0375412808.01.THUMBZZZ.jpg</book:thumbnail> </entry>
のようなレスポンスを受け取ります。エントリの要素の book:isbn
は http://sixapart.com/atom/book# という namespace で拡張された要素を表しています。
こうしてみてくると、Atom というのは HTTP の REST アーキテクチャを利用した、汎用コンテンツ編集のAPIなのかなあ、という気もしてきます。よりライトウェイトになった SOAP のようなモノですね。実際、CPAN の XML::Atom モジュールでは、REST 風と SOAP 風での Atom API 実装をオプションで切り替えることもできます。つまり役割としてはSOAP とおなじレイヤーに位置しているということがいえます。atom-syntax メーリングリスト でもこれは話題になっていて、The Atom API is just for Blogging?スレッドからその様子を見ることができます。
しかし、ライトウェイトになった SOAP って、それ XML-RPC じゃダメなの?とか思ってしまいます。XML-RPC と違うのは、より REST アーキテクチャよりになっているということです。XML-RPC では、1つのエンドポイントURI (たとえば http://www.typepad.com/t/api)に対して、XML でエンコードされたメッセージを投げます。
もっともよく使われている XML-RPC の例としては weblogUpdates.ping がありますが、これは
POST http://example.com/rpc Content-Type: text/xml <?xml version="1.0" encoding="UTF-8"?> <methodCall> <methodName>weblogUpdates.ping</methodName> <params> <param><value><string>blogname</string></value></param> <param><value><string>blogurl</string></value></param></params> </methodCall>
のような HTTP メッセージになっていて、メソッドがPOST であることとエンドポイントURIは固定されています。Atom の場合は、もう少しHTTPを有効に活用するために、
と、より直感的になっています。それ以外にも認証を WSSE (Web Service Security Enforcement) を使用している、とかもありますがここでは省略。
しかし URI で編集対象を表現して、HTTP のメソッドで内容を書き換える、っていうと WebDAV を思い出します。Atom Wiki でも Relationship between Atom and WebDAV としてこの関係が議論されています。WebDAV はバーチャルなファイルシステムに特化しているのに比べ、AtomはAPIなのでより自由度が高い (= 実装側でやるべきことが多いという意味でもある)というところが違いでしょうか。
SOAP よりライトウェイト、XML-RPC より REST 重視、WebDAV よりアプリケーション層の自由度が高い。Atom の特徴を、競合技術と比較するとこう表現することもできるかもしれません。