お問い合わせ
会社概要 ソフトウェア 開発ブログ サポート

3章 Atom出版プロトコル - The Atom Publishing Protocol(AtomAPI)

最終更新日:2005/03/03   © Witha System, Ltd

Witha System » Atom目次
» [1章 The Atom Project - RSSの興隆からAtomの誕生]
» [2章 Atomフォーマット - The Atom Syndication Format]
» [3章 Atom出版プロトコル - The Atom Publishing Protocol(AtomAPI)]
» [4章 The Atom Publishing Protocol(AtomAPI)の利用法]
» [AtomやAtomAPI関連のニュースや仕様へのリンク]
» [RSS 2.0 と Atom 1.0 の比較]

3章 Atom出版プロトコル - The Atom Publishing Protocol(Atom API)

はじめに

 

IETFに移管されたのを機に,元々Atom APIと呼ばれていたものが、The Atom Publishing Protocolという正式名称になりました。しかし、一般的にはAtom APIという名称が定着している模様ですので、ここでもAtom APIとして説明して行きたいと思います。
 AtomAPIとは,ウェブログやWikiなどのウェブ上のコンテンツ(リソース)を編集するためのアプリケーションレベルの通信規約(プロトコル)です。これにより,AtomAPIに対応したシステムに対して,外部から操作することが可能となります.デスクトップ上のソフトウェアやデータベースとの連動,さらには,携帯などのモバイル機器との通信が可能となりますので,様々な可能性が開けます.

AtomAPI対応サービス・ツール

 

本稿執筆の時点では,AtomAPIを実装しているウェブログのツールやサービスは,SixApart社が提供しているホスティング型サービスのTypePad(ニフティのココログやOCNのブログ人等でも利用されている),インストール型のMovableType,ライブドア社が提供しているLivedoor Blog,GoogleのBlogger,そしてMac OS X Serverにバンドルされる事になっているBlojsomなどがあります.もちろん,AtomAPIの仕様が正式なものではないので,どれもベータバージョンの位置付けとなっています.
 また,最近では携帯大手のNokia社が提供する「Lifeblog」というサービスにて,携帯からAtomAPIを利用したウェブログ対応サービスを2005年前半より開始するという発表もあり,すでに,これに対応した新しい携帯も発表されています.他にも様々なツールの開発者がAtomAPIに対応する事を表明しています.AtomAPIの将来は比較的明るいと見てよいかもしれません.

AtomAPIの特徴

 

AtomAPIの大まかな仕組みは,クライアントがXML形式のコンテンツを送信し,サーバーがそのXMLを受け取り,データを格納します.ウェブログでいうと,これが投稿になります.またクライアントがコンテンツを要求すると,サーバーはXML形式のコンテンツを返します.さらに,ここで送受信されるXMLが,ほかならぬ,Atomフォーマットです.

HTTPを最大限活用

 

AtomAPIでは,エラーなどの通知に通常のHTTPステータスコードを利用します.また,HTTPメソッドのPOST,GET,PUT,DELETEなどのアクションを活用し,リソース,つまり対象(オブジェクト)を識別するためにURIを用います.HTTPは枯れた技術であり,開発者にとっても扱いやすいという利点があります.HTTPとURIをこのように活用するスタイルを一般的にRESTアーキテクチャと呼びます.
 とここまで読んで,お気づきになられた方もいるかも知れませんが,AtomAPIはWebDAVと非常に良く似ています.Atomの開発者達がWebDAVを意識していないというと嘘になりますが,WebDAVとくらべると,いくつか相違点があります.AtomAPIにはPropFindやMKCOLのような拡張メソッドもありませんし,ロック機構なども実装されていません.XMLの構造自体もAtomの方がシンプルです.また,WebDAVが主にリモートファイル操作という用途に用いられるのに対して,AtomAPIは,その正式名称が示す通り,出版つまりウェブ上にコンテンツを公開するために用いることを想定しています.WebDAVはより重量級,AtomAPIはよりライトウェイト,逆に言えば自由度が高いと言って良いかもしれません.

XMLを最大限活用

 

送受信される形式がXMLであり,文字コードなどに悩まされる必要はありません.また,スキーマにより定義されたXMLと名前空間を利用した機能を十分に生かす事が出来ます.名前空間を使うと,開発者はすでに定義されたXMLを独自に拡張し,既存の仕様と整合性を保ちながら,独自の機能を実装し,利用する事ができます.これによりシンプルでありながら,スケーラブルなものになります.

SOAP対応

 

AtomAPIでは,RESTアーキテクチャを採用するだけでなく,XML Web サービスの仕様の一つである,SOAPでの通信もサポートします.開発者がどちらか自分の好きな方法を選択できます.しかし,Amazon のXMLウェブサービスでは,SOAPとREST方式の二つの方式のうち約80%の開発者がREST方式を選択したという結果は有名ですが,やはりAtomAPIを実装する開発者の多くもシンプルなREST方式を選択しているようです.
 SOAPを実際に使うケースとして,例えば携帯で動くアプリケーションを開発する際,環境によっては,HTTPのPUT,DELETEなどのメソッドを利用できない場合などがありますから,SOAPを利用するケースも実際にはあるかもしれません.

XML-RPCとAtomAPI

 

実は,MovableTypeやTypePad,Blogger,Nucleus,WordPressなど一般的なウェブログのツールではすでにXML-RPCを使い,記事の投稿,編集,カテゴリや記事のオプションの設定,削除,ファイルのアップロードなどを行なう事が可能となっています。しかしながら,MovableTypeやTypePad,Bloggerなどでは,XML-RPCをすでにサポートしていながらも,徐々にAtomAPIに移行していこうという動きがあります.

XML-RPC

 

XML-PRCとは何かというと,基本的にアプリケーションの手続きのPRC(遠隔呼び出し)をXML形式にシリアライズした物だと考えることが出来ます。つまり,本来アプリケーション内でよびだす関数やプロシジャをネットワーク越しに呼び出すような感じです.これにより,ウェブログのシステムで実装され公開されているプロシージャを外部からメソッドと引数を指定してHTTP上で呼び出す事が出来ます。その呼び出しと返り値がXML形式で行なわれ,変数の型なども指定する事が出来る汎用的な仕様です。
 現在,ウェブログで使われているXML-PRC APIの種類は複数あり,ほとんどのケースではそれを組み合わせて使っています。主にBlogger API,MetaWeblog API,そしてMovableTypeでの固有の機能(トラックバックなど)を利用するためのMovableType XML-RPC APIなどがあります.

ウェブログで主に使われているXML-RPCのメソッド
Blogger API
 blogger.newPost
 blogger.editPost
 blogger.deletePost
 blogger.getRecentPosts
 blogger.getUsersBlogs
 blogger.getUserInfo
MetaWeblog API
 metaWeblog.newPost
 metaWeblog.editPost
 metaWeblog.getPost
 metaWeblog.getRecentPosts
 metaWeblog.newMediaObject
MovableTyoe XML-PRC API
 mt.getRecentPostTitles
 mt.getCategoryList
 mt.getPostCategories
 mt.setPostCategories
 mt.supportedMethods
 mt.supportedTextFilters
 mt.getTrackbackPings
 mt.publishPost

ウェブログの情報を取得するメソッド, blogger.getUsersBlogsの例

<?xml version="1.0"?>
<methodCall>
<methodName>blogger.getUsersBlogs</methodName>
<params>
<param>
<value>
<string></string>
</value>
</param>
<param>
<value>
<string>ユーザ名</string>
</value>
</param>
<param>
<value>
<string>パスワード</string>
</value>
</param>
</params>
</methodCall>

AtomAPIを用いる利点

 

では,すでにXML-RPCがあるのに,新たな仕様を求める理由はなんでしょうか.XML-RPCの仕様自体は非常にシンプルで,各言語におけるXML-RPCのライブラリやモジュールが比較的充実していますので実装も容易ではありますが,セキュリティや機能の拡張性という面で幾つか問題があります.また,XML-RPCの仕様が特定のベンダや個人の管理のもとにあるため、融通が利かないといった問題もあります.事実,つい最近までXML-RPCではASCII以外の文字コードの使用が禁止され日本語などを直接利用する事が出来ませんでした.
 またウェブログに限っての話ですが,XML-RPCではAPIセットが複数あるため,どのメソッドを実装すれば良いのか分かりにくくなってきたいった点もあります.たとえば,投稿はMetaWeblogAPIで行ない,削除はBloggerAPIで行なうなどといった事も、AtomAPIの仕様が完成すればAtomAPIで統一出来るでしょう.
 AtomAPIは新しい仕様で,かつオープンであり,XML-RPCでの経験も踏まえてより良いものを作る事が可能です.AtomAPIとXML-RPCの特徴を具体的に幾つかの点を比較しながら解説してみたいと思います.

セキュリティ
 

XML-RPCには基本的にセキュリティの概念がありません.ですから,XML-RPCで通信する際はパスワードやユーザー名が平文で流れてしまいます.SSLなどで通信を丸ごと保護しなければ,パスワードを保護する事は出来ません.レンタルサーバーに設置したウェブログでは殆どのケースでは無理ですし,SSL通信はコストがかかります.
 Atom APIでは後ほど詳しく解説しますが,SHA1というアルゴリズムを用いてパスワードの代わりにハッシュと呼ばれる物が送信されるので,より安全と言えます.

タイムゾーンの問題
 

XML-PRCには今の所,日付時刻のタイムゾーンの指定が出来ません。XML-RPCの仕様によると,「タイムゾーンはサーバ側の文書で、どのタイムゾーンを使用するか指定します」とあります.これではよく分かりません.現実に,日付や時刻が実際とは9時間ずれてしまうなど相互運用性の問題が日本でも非常に多く見受けられます.海外の開発者の間では,XML-RPCでの日付時刻の仕様を無視して,UTC形式の日付時刻を使おうという意見も,あまり好ましくはありませんが,広まっています.

拡張性
 

XML-RPCを利用した場合,XMLの強力な利点である名前空間による拡張という機能を使う事が出来ません。拡張が利用でいないと,似たようなAPIが増えてしまったり,あるAPIに独自の機能を追加したくてもできないといった問題があります。実際,ほぼにたような動作をするXML-RPCのAPIをサービス提供者が独自に提供してしまうといった事も起きており,相互運用性が損なわれる恐れも現実のものとなって来ています.
 AtomAPIでは逆に,拡張ありきといっても過言ではありません.AtomAPIはウェブログやWikiなどを主なターゲットとして始まりましたが,それらに限定されるものではありません.AtomAPIでは必要最低限の項目をAtomのコアとして定義し,ウェブログ固有の項目(例えば追記)は拡張として定義するというスタンスに立っています.ですから,一つのAPIをもとに,独自機能だけを名前空間を用いて拡張して用いることが出来るため,相互運用性を損ねることなく,独自の機能を実装する事が出来ます.
 また,Atomはウェブログのためだけにあるわけではありません.ですから,AtomAPIをベースにして名前空間による拡張を用いて,例えばショッピングサイト上の商品情報の管理を行なうといった事も可能なのです.
 AtomAPIとXML-RPCの違いを拡張性という点に関して例えると,継承などが使えるオブジェクト指向と非オブジェクト指向の違いと言ったら分かりやすいかも知れません.Webサービスの世界では,この違いは,Document(文書)モデルとRPC(遠隔手続き呼び出し)モデルとして区別されます.

新機能
 

AtomAPIの仕様には,XML-RPCに実装されていない、様々な機能も追加される予定です.その中には,例えば,ユーザの追加・削除・編集,ユーザごとの環境設定,コメントの投稿・取得,テンプレートの設定・取得などが含まれます.

ウェブログに限定されないAtomAPI

 

AtomAPIでは様々な新しい機能を取り入れつつ高機能で拡張性のある仕様を作ることを目標としています.最低限の基本要素のみをAtomコアとして定義し,XMLの拡張を利用するAtomはウェブログに限らず,様々な用途で用いることができます。ウェブログでの活用を始めとして,AtomAPIは今後ますます重要度が増して行くと思われます.

AtomAPIクライアント実装のポイント

 

さて,前置きが長くなりましたが,AtomAPIを利用する際のポイントとなる点を見ていきましょう.
 AtomAPIは,HTTPに元々あるPOSTやGETなどのメソッドを利用して,リソースの作成・取得・編集・削除・アップロードを行ないます.また,REST方式とSOAPの両方をサポートしているのも特徴です.今回はシンプルなREST方式のAPIを使います.どれだけシンプルかというと,例えば投稿は,指定されたアドレスにAtom形式のXMLに認証情報をつけてHTTPのPOSTで送信するだけというシンプルなものです.では,具体的なポイントを解説していきます.

HTTPメソッド

 

AtomAPIで利用するHTTPメソッドは,
  ・GET:リソースの取得.
  ・POST:リソースを新規に作成.
  ・PUT:リソースを更新.
  ・DELETE:リソースを削除.
の四つがあります.
 例えば,ウェブログで過去記事を取得するには,指定されたURIにGETリクエストを送信すれば,過去記事がAtomフィードとして取得することが出来ます.またリソースに割り当てられたURIにDELETEリクエストを送信するとリソースが削除されます.

Atomエントリドキュメント

 

Atomエントリドキュメントとは,Atomフィードの中の一つのエントリつまり,<entry>タグ以下の要素を指します.

<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://purl.org/atom/ns#">
<title>New Entry</title>
<modified>2004-10-31T14:27:33Z</modified>
<issued>2004-10-31T23:27:33+09:00</issued>
<id>tag:blog.example.jp,:***.8726045</id>
<author>
<name>***</name>
</author>
<content type="text/html" mode="escaped" xml:lang="ja">
<p>Hello World</p>
</content>
</entry>
 例えば,新規に投稿するには,AtomエントリドキュメントをPOSTし,上書きするには,AtomエントリドキュメントをPUTします.
 必須要素は使用するメソッドや次に説明するサービスURIによって異なります.

サービスURI

リクエストを送信する先のURIには,
  ・PostURI:AtomのエントリドキュメントをPOSTします.
    このURIにPOSTリクエストを送信すると新規にリソース(ウェブログの記事など)が作成されます.
  ・EditURI:個々のリソースに割り当てられたURI.PUT, GET,およびDELETEを使用出来ます.
    このURIにPUTリクエストを送信すると,記事が上書きされます.GETで,記事を取得,DELETEで記事を削除となります.
  ・FeedURI:GETリクエストを送信し,Atomフィードを取得できます.
  ・UploadURI:ファイルのアップロードを行います.POSTを利用します.
  ・CategoryURI:GETを利用してウェブログなどのカテゴリ一覧を取得します.

があります.但し,UploadURIは最近追加された仕様のため,まだ殆どのサービスで実装されていません.また,CategoryURIはすでに使われている場合がありますが,最新の仕様では異なっている可能性があるので注意が必要です.

エンドポイントURI

 

これらのサービスURIを取得するには,エンドポイントURIにGETリクエストを送信することで取得できます.通常,このエンドポイントURIはツールのマニュアルやヘルプに記載されています.エンドポイントURIにGETリクエストを送信すると,以下のようなXML文書が返ってきます.このXMLに記述されているのが,PostURIとFeedURIです.

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://purl.org/atom/ns#">
<link type="application/atom+xml" rel="service.post" href="http://blog.example.com/atom/blog_id=0001" title="My Blog"/>
<link type="application/atom+xml" rel="service.feed" href="http://blog.example.com/atom/blog_id=0001" title="My Blog"/>
</feed>

 このケースでは,PostURIとFeedURIは,http://blog.example.com/atom/blog_id=****で同一のものとなっています.

認証

 

AtomAPIでは、リクエストを送信する毎に,ユーザ名とパスワードを元にした認証情報を生成しなければなりません.AtomAPIで現在採用されている認証はWSSE Username Tokenといって,SHA1というアルゴリズムを用いてパスワードとランダム文字列,作成日時をもとにハッシュを作成するというものです.AtomAPIではこのユーザー名とこのハッシュをHTTPリクエストの際,ヘッダに挿入ます.
 このハッシュからパスワードを得ることは非常に難しいので,セキュリティ的により安全だと言えます.しかしながら,認証については,Atomの仕様が正式なものになる時には,別の方法が採用される可能性が高いと思われます.どうなるか今の所不透明ですが,HTTPですでに広く利用されている認証方法が採用されると思われます.

PasswordDigestの生成手順
 

認証のためのヘッダ作成手順は,
1.Nonceと呼ばれるランダムな文字列を作成します。これは,毎回リクエストごとにランダムに生成するべきでしょう.
2.次に,Nonceを生成した日時をISO-8601形式でCreatedという値で作成します.
3.NonceとCreatedとパスワードからSHA1のハッシュ、PasswordDigestを生成します.Perlのコードで表現すると以下のようになります.
 base64(sha1(Nonce . Created . Password))
上記のように,NonceとCreatedの値とパスワードを連結して、SHA1でハッシュを作成し,Base64でエンコードしています.
4.作成した,NonceとCreated,PasswordDigestそしてユーザ名を使ってHTTPヘッダを追加します.まずは,どんなものか見てみましょう.
 X-WSSE: UsernameToken Username="Melody", PasswordDigest="VfJavTaTy3BhKkeY/WVu9L6cdVA=", Created="2004-01-20T01:09:39Z", Nonce="7c19aeed85b93d35ba42e357f10ca19bf314d622"
 ユーザ名はそのまま利用し,作成したNonceとCreated,PasswordDigestの値をそれぞれ挿入します.ただし,ここで注意しなければならないのは,Nonceの値をHTTPのヘッダーに入れる前に,Base64でエンコードしなければならないという事です.これを忘れるとうまくログインできません.

AtomAPIを使ってウェブログに記事を投稿する手順

 

AtomAPIに対応したウェブログのサービスは前述したように幾つかありますが,ここでは,無料ですぐ使えるLivedoor Blogを例にとって具体的な手順を解説して行きます.基本的にはTypePadやBloggerでも同様です.

記事の投稿から編集,削除まで

 

Livedoor BlogでのAtomAPIのエンドポイントURIは,http://blog.livedoor.com/atomです.このURIにアクセスして,ウェブログの情報を取得することから始まります.

ウェブログの情報を取得
 

エンドポイントのhttp://blog.livedoor.com/atomに認証情報をヘッダに挿入したGETリクエストを送信します.
 生のHTTP通信は以下のようになります.

リクエスト:
GET http://blog.livedoor.com/atom HTTP/1.1
X-WSSE: UsernameToken Username="***", PasswordDigest="eNSBiuFfcLpau1RfWc3lOWufje0=", Nonce="ZGFrZHZueGJ6aGh1", Created="2004-10-31T14:08:34Z"

リスポンス:
HTTP/1.1 200 OK
Content-Type: application/x.atom+xml

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://purl.org/atom/ns#">
<link xmlns="http://purl.org/atom/ns#" type="application/x.atom+xml" rel="service.post" href="http://blog.livedoor.com/atom/blog_id=****" title="***"/>
<link xmlns="http://purl.org/atom/ns#" type="application/x.atom+xml" rel="service.feed" href="http://blog.livedoor.com/atom/blog_id=****" title="***"/>
<link xmlns="http://purl.org/atom/ns#" type="application/x.atom+xml" rel="service.categories" href="http://blog.livedoor.com/atom/blog_id=****/svc=categories" title="***"/>
</feed>

 このリスポンスにはlinkという要素が三つ含まれています.rel属性の値がservice.postである要素のhref属性の値http://blog.livedoor.com/atom/blog_id=****がPostURIです.同様に,service.feedがFeedURIです.service.categoriesは実験的に実装されたカテゴリの一覧を取得するCategoryURIです.(最新の仕様とは異なる可能性があるため割愛します)
 もし,ウェブログが複数ある場合は,それぞれウェブログの数だけ,PostURIとFeedURIが繰り返し出現するので注意が必要です.

投稿
 

新規に記事を投稿するには,PostURIにAtomエントリドキュメントをPOSTします.

リクエスト:
POST http://blog.livedoor.com/atom/blog_id=**** HTTP/1.1
X-WSSE: UsernameToken Username="***", PasswordDigest="CKd9omCnSbCudvwu8TBcmEyin3Y=", Nonce="NzhkOXFubmNyOHpk", Created="2004-10-31T14:25:31Z"
Content-Type: application/x.atom+xml

<?xml version="1.0"?>
<entry xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<title mode="escaped">New Entry</title>
<generator url="***" version="1.x">***</generator>
<dc:subject type="text/html" mode="escaped">test</dc:subject>
<content type="application/xhtml+xml" mode="escaped">Hello World</content>
</entry>

リスポンス:
HTTP/1.1 201 Created
Location: http://blog.livedoor.com/atom/blog_id=***/entry_id=****
Content-Type: application/x.atom+xml

<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<title>New Entry</title>
<link rel="alternate" type="text/html" href="http://blog.livedoor.jp/***/archives/***.html"/>
<link rel="service.edit" type="application/x.atom+xml" href="http://blog.livedoor.com/atom/blog_id=***/entry_id=****" title="New Entry"/>
<modified>2004-10-31T14:27:33Z</modified>
<issued>2004-10-31T23:27:33+09:00</issued>
<id>tag:blog.livedoor.jp,:***.8726045</id>
<author>
<name>***</name>
</author>
<summary type="text/plain">Hello World</summary>
<dc:subject>test</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://blog.livedoor.jp/***/archives/***.html">
<![CDATA[Hello World]]>
</content>
</entry>

成功時のリスポンスは,201 Createdです.リスポンスのLocationヘッダーまたは,Atomエントリドキュメントのrel属性の値がservice.editであるlinkタグにあるのが,EditURIです.このEditURIを用いて,今作成した記事の編集や削除を行います.
 もう一つのlinkタグにあるURI,http://blog.livedoor.jp/***/archives/***.htmlをブラウザで確認すると,今送信した内容がHTMLページに反映されている事が確認できます.

編集
 

既存のリソースを編集するのは,投稿とほぼ同じで,異なるのは,HTTPのメソッドはPOSTではなくPUTであり,URIはPostURIではなくEditURIだというだけです.

リクエスト:
PUT http://blog.livedoor.com/atom/blog_id=***/entry_id=**** HTTP/1.1
X-WSSE: UsernameToken Username="***", PasswordDigest="nHY1KWuBrIOmm3Ku8ywnddK3Wyg=", Nonce="cm15djRmcmw2OGFp", Created="2004-11-03T15:26:22Z"
Content-Type: application/x.atom+xml

<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<title>New Entry</title>
<link rel="alternate" type="text/html" href="http://blog.livedoor.jp/***/archives/***.html"/>
<link rel="service.edit" type="application/x.atom+xml" href="http://blog.livedoor.com/atom/blog_id=***/entry_id=****" title="New Entry"/>
<modified>2004-10-31T14:27:33Z</modified>
<issued>2004-10-31T23:27:33+09:00</issued>
<id>tag:blog.livedoor.jp,:***.8726045</id>
<author>
<name>***</name>
</author>
<summary type="text/plain">こんにちは世界</summary>
<dc:subject>test</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://blog.livedoor.jp/***/archives/***.html">
<![CDATA[こんにちは世界]]>
</content>
</entry>

成功時のレスポンスコードは,200 OKです.

削除

削除も同様に,EditURIを用います.DELETEリクエストをEditURIに送信します.

DELETE http://blog.livedoor.com/atom/blog_id=***/entry_id=**** HTTP/1.1
X-WSSE: UsernameToken Username="***", PasswordDigest="YZt6HVYHQOJW3rFIzjI90l09PIU=", Nonce="cHp4YW15eWxrZm43", Created="2004-11-03T15:59:23Z"

成功時のレスポンスコードは,200 OKです.

取得

FeedURIに対してGETリクエストを送信すると,記事の一覧をAtomフィードとして取得できます.その一覧から個々のエントリのEditURIを取得できますから,任意のエントリを選択して,編集,削除などが出来ます.

FeedURIに対してGETリクエスト:
GET http://blog.livedoor.com/atom/blog_id=*** HTTP/1.1
X-WSSE: UsernameToken Username="***", PasswordDigest="nlkDyuprEY341Jf6p7Soqcimqy4=", Nonce="cGV4OGthdmc3Z2E5", Created="2004-11-03T15:44:17Z"

リスポンス:
HTTP/1.1 200 OK
Content-Type: application/x.atom+xml

<?xml version="1.0" encoding="UTF-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="ja">
<title>****</title>
<link rel="alternate" type="text/html" href="http://blog.livedoor.jp/***/"/>
<link rel="service.post" type="application/x.atom+xml" href="http://blog.livedoor.com/atom/blog_id=****" title="***"/>
<modified>2004-11-03T15:46:21Z</modified>
<author>
<name>***</name>
</author>
<id>tag:blog.livedoor.jp,2004:***</id>
<generator url="http://blog.livedoor.com/" version="1.0">livedoor Blog</generator>
<copyright>Copyright (c) 2004, *** </copyright>
<entry>
<title>test</title>
<link rel="alternate" type="text/html" href="http://blog.livedoor.jp/***/archives/****.html"/>
<link rel="service.edit" type="application/x.atom+xml" href="http://blog.livedoor.com/atom/blog_id=***/entry_id=****" title="test"/>
<modified>2004-11-03T15:46:20Z</modified>
<issued>2004-11-04T00:46:20+09:00</issued>
<id>tag:blog.livedoor.jp,2004:***.885425</id>
<summary type="text/plain">test</summary>
<dc:subject>test</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://blog.livedoor.jp/***/archives/******.html">
<![CDATA[test]]>
</content>
</entry>
<entry>
<title>こんにちは世界</title>
<link rel="alternate" type="text/html" href="http://blog.livedoor.jp/***/archives/******.html"/>
<link rel="service.edit" type="application/x.atom+xml" href="http://blog.livedoor.com/atom/blog_id=***/entry_id=****" title="こんにちは世界"/>
<modified>2004-11-03T15:28:27Z</modified>
<issued>2004-10-22T16:58:39+09:00</issued>
<id>tag:blog.livedoor.jp,2004:***.837337</id>
<summary type="text/plain">こんにちは世界</summary>
<dc:subject>test</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://blog.livedoor.jp/hepcat/archives/****.html">
<![CDATA[こんにちは世界]]>
</content>
</entry>
</feed>

拡張
 

ウェブログをお持ちの方は,お気づきになったかもしれませんが,上記のサンプルではウェブログで一般的な自動改行の指定や,コメントやトラックバックの許可の指定,さらに追記文などがありませんでした.AtomAPIでは,これらをXMLの名前空間の拡張機能を利用して実装します.
 下のサンプルは,AtomAPIをXMLの名前空間を利用した拡張を用いて,ウェブログ用の拡張をしたAtomエントリドキュメントです.mtというプレフィックスのついた要素でウェブログ,特にMTで用いられるオプションを定義しています.(ここでは便宜上,http://www.movabletype.org/atom/ns#という名前空間を用いています.実際には,まだ拡張は定義されていませんので利用することは出来ません.)

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://purl.org/atom/ns#" xmlns:mt="http://www.movabletype.org/atom/ns#">
<title>My Entry Title</title>
<created>2003-11-17T12:29:29Z</created>
<content type="application/xhtml+xml" xml:lang="en">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Hello, <em>weblog</em>world!</p>
<p>This is my first post<strong>ever</strong>!</p>
</div>
</content>
<mt:allowComments>1</mt:allowComments>
<mt:allowPings>1</mt:allowPings>
<mt:convertLineBreaks>1</mt:convertLineBreaks>
<mt:trackBackPings>
<mt:ping url="hoge"/>
<mt:ping url="fuga"/>
</mt:trackBackPings>
<mt:extendedText type="application/xhtml+xml" xml:lang="en">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>You are reading more text.</p>
</div>
</mt:extendedText>
</entry>
 拡張した部分はそれぞれ,
mt:allowCommentsは記事に対するコメントを許可するか否か.
mt:allowPingsは,トラックバックPingを受け入れるかどうか.
mt:convertLineBreaksは自動改行をオンにするか否か.
mt:trackBackPingsの子要素には,トラックバックPingを送信するURLを複数指定します.
mt:extendedTextには,記事の追記文を入れます.
というものにしています.

 XML-RPCでは,新たにメソッドを追加する必要がありましたが,AtomAPIでは名前空間を用いて機能を拡張することが出来ます.

AtomAPI拡張の実際

 

AtomAPIの利点としてXMLの名前空間による拡張をとりあげてきました.ここでは実際にAtomAPIを拡張したサービスとして,現在TypePad(http://www.typepad.jp/)でベータ公開されている,Photo Album APIとTypeList API での利用例を紹介したいと思います.

TypePadでの拡張 -Photo Album API

 

TypePadでは,ウェブログの他に,オンラインフォトギャラリを作ることが出来ます.そのフォトギャラリに写真を追加したり削除したりするのが,このPhoto Album APIです.
 以下の要素が用いられています.

Photo Albumで使われる要素
 

-名前空間 http://purl.org/atom/ns#
○title:写真の名前(必須)
○summary:写真のキャプション(オプション)
○issued:写真がアップロードされたISO-8601 形式の日時
○content:Base64でエンコードされた写真データ(もし,filenameが指定されていなかった場合,contentタグのType属性で適切なコンテントタイプを指定しなければならない)
 -名前空間 http://sixapart.com/atom/photo#
●filename:拡張子を含めたファイルの名前(オプション)
●location:写真が撮影された場所(オプション)
●taken:写真が撮影されたISO-8601 形式の日時

 黒丸のタグが,http://sixapart.com/atom/photo# という名前空間のもとに新たに追加されている要素です.

Atomエントリドキュメントは実際には以下のようなXMLになるでしょう.
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://purl.org/atom/ns#" xmlns:photo="http://sixapart.com/atom/photo#">
<title>友達とパーティ</title>
<summary>誕生日のパーティをしました。</summary>
<photo:location>自宅</photo:location>
<photo:taken>2004-09-30T07:29:24Z</photo:taken>
<content mode="base64" type="image/jpeg">/9j/2wCEAAQDAwQDAw.../9n/AA==</content>
</entry>

 このXMLをPhotoAlbumAPIのエンドポイントURIから取得したPostURIにPOSTすれば,写真をTypePadのフォトアルバムに追加することが出来ます.
 TypePadの日本語版(https://www.typepad.jp/)では,エンドポイントはhttp://www.typepad.jp/t/atom/galleryとなります.

 このAPIを使えば,ローカルの画像用フォルダとオンラインのフォトギャラリーで同期をとったり,ドラッグアンドドロップで簡単に追加や削除をするクライアントソフトを作成することが出来ます.

TypePadでの拡張 -TypeList API

 

TypeListは,「音楽」,「リンク」,「ひと」,「本」のリストを作成して,TypePadのウェブログのサイドバーなどに表示させることが出来る機能です.これも,Photo Album APIと同じく,名前空間による拡張を用いています.このTypeList APIに対応した,クライアントソフトを作ることも出来ます.

「音楽」で使われる要素
 

-名前空間 http://purl.org/atom/ns#
○title:「アーティスト名 - 曲名」のフォーマットで指定.読み出しのみで,PostURIとEditURIでは無視される.
○content:曲に関するメモやレビュー.
○issued:TypePadに追加された日時.
 -名前空間 http://sixapart.com/atom/song
●title:歌のタイトル.
●album:アルバムのタイトル.
●artist:アーティスト名.
●thumbnail:アルバムカバーのサムネイル画像のURL.
 -名前空間 http://purl.org/NET/RVW/0.1/
●value:曲につけた1から5の評価.

「リンク」で使われる要素
 

-名前空間 http://purl.org/atom/ns#
○content:ウェブサイトのレビューまたはメモ.
○title:ウェブサイトのタイトル.読み出しのみで,PostURIとEditURIでは無視される.
○issued:TypePadに追加された日時.
 -名前空間 http://sixapart.com/atom/link#
●url:ウェブサイトのURL.このURLがあれば,TypePadは自動的に,ウェブサイトのタイトルを取得します.
●title:ウェブサイトのタイトル.

「ひと」で使われる要素
 

-名前空間 http://purl.org/atom/ns#
○title:人の名前.読み出しのみで,PostURIとEditURIでは無視される.
○issued:TypePadに追加された日時.
 -名前空間 http://sixapart.com/atom/person#
●homepage:個人のウェブサイトのURL.このURLがあれば,TypePadは自動的に,FOAFを探し,見つけると各種の情報を取得します.
●name:ひとの名前.
●homepage_name:個人のウェブサイトの名前.
●email:個人のEmailアドレス.
●foaf_url:ひとのFOAFファイルのURL.
 -名前空間 http://purl.org/vocab/bio/0.1/
●olb:短い(一行の)個人のバイオグラフィーまたはメモ.

「本」で使われる要素
 

-名前空間 http://purl.org/atom/ns#
○content:本についてのレビューまたはメモ.
○title:「著者名: 本のタイトル」のフォーマットでタイトルを指定.読み出しのみで,PostURIとEditURIでは無視される.
○issued:TypePadに追加された日時.
 -名前空間 http://sixapart.com/atom/book#
●isbn:本のISBN.この値があると,TypePadは,Amazon.comを検索して,各種情報を自動的に取得します.
●title:本のタイトル.
●author:本の著者名
●thumbnail:本のカバー画像のサムネイルのURL.
 -名前空間 http://purl.org/NET/RVW/0.1/
●value:本につけた1から5の評価.

以上,四つのTypeListのエンドポイントはhttp://www.typepad.jp/t/atom/listsとなります.

まとめ

 

HTTPとXMLを利用した非常にシンプルで直感的な仕様である事がお分かりいただけたでしょうか.またAtomAPIの拡張という柔軟な機能によって,様々な用途にも応用する事が出来るのです.
 例えば,今までショッピングサイトに商品を登録するのに,ブラウザで一々商品データを入力していた事が,ローカルの商品データベースと連携することによりショッピングサイトの商品管理がどれだけ効率化されるかお分かりでしょう.また,例えば不動産物件情報を検索サイトに登録するには,一々物件情報を検索サイトごとにブラウザでログインして入力しています.これもまた,AtomAPIをベースに拡張することにより,新規物件の登録,削除,変更が物件管理システムから直接行う事が可能になります.
 AtomAPIはまだまだ未完成ですが,それは同時にあなたもAtomAPIを改良していく作業に参加できるという事でもあります.また,新しい技術ですからAtomAPIを利用したツールやサービスには開拓の余地があります.もし,AtomAPIを利用した新しいサービスを思いついたら,ぜひで実装してみてください.

関連情報

「blog.livedoor.com Atom API Spec」
Livedoor BlogのAtom API 仕様
http://blog.livedoor.com/spec_atom_api.html

「TypePad Atom API」
TypePadでのAtom APIの仕様
http://sixapart.com/developers/atom/typepad/

「The Atom API」
現時点で一般的に実装されている AtomAPIの仕様書(ドラフト)
http://www.atomenabled.org/developers/api/atom-api-spec.php

「Atom Publishing Format and Protocol (atompub)」
最新のIETFでのドラフト
http://www.ietf.org/html.charters/atompub-charter.html