連載 [第4回] :
PerlでWeb APIを使いたおすアーキテクチャスタイル「REST」とは何か
2006年10月10日(火)
AtomPPとは
RESTアーキテクチャスタイルを利用して設計されたWeb APIの汎用的な仕様として、AtomPPを見ていくことにしましょう。AtomPP(Atom Publishing Protocol)はかつてはAtom APIと呼ばれていたもので、有志によって開発が行われています。
Atomというと、RSSと並ぶ情報配信フォーマットを思い浮かべる方もいるかもしれません。そちらはAtomの中でもAtom Feedと呼ばれるデータフォーマットです。Atomは、情報配信フォーマットであるAtom Feed、Atom Feedを自動的に発見するための仕様であるAtom AutoDiscovery、そしてAtomPPの3つの仕様で構成されています。
AtomPPは、やり取りする情報としてAtom Feedのデータを利用します。AtomPPは現在まだ完成してはおらず、本稿執筆時のバージョンは0.9ですが、すでにAtomPPを利用したAPIも登場しています。例えば、はてなブックマークAPIでは、AtomPPを利用して、ブックマークを登録したりできます。また、Movable Type(TypePad)やBlogger、livedoor Blogは、AtomPPを利用したブログのエントリの取得や更新、削除に対応しています。さらに、GoogleがGoogle Calendarなどで利用しているGData(Google Data API)では、AtomPPの仕様を拡張し、RSSなどをAtom Feedの代わりにも利用できるようにしたものを採用しています。
それではAtomPPの仕様を見ていくことにしましょう。AtomPPでのリソースは表5の3つに分類できます。
リソース | 意味 |
---|---|
Collection | Memberをまとめたもの |
Member | 個々の情報 |
Introspection Document | アクセス可能なCollectionの一覧 |
ブログを例にとると、Memberが個々のブログのエントリ、Collectionはブログそのもの、Introspection Documentはアクセス可能なブログの一覧、ということになるでしょう。また、カテゴリもCollectionの1つということになります。ブログにエントリを追加する場合は、ブログ(Collection)のURIに対してPOSTメソッドでエントリのデータを送信することになります。同じブログのURIに対してGETメソッドでアクセスすれば、エントリの一覧が取得できます。
そして個々のエントリの取得、編集や削除は、そのエントリのURIに対してGETやPUT、DELETEメソッドを利用してアクセスすることで可能になるわけです。
例えばブログに新しいエントリを投稿するのであれば、そのブログのURI(Collection)に対して前ページのリスト16のようなAtom Feed形式のデータをPOSTで送信します。
リスト16:AtomPPでブログのエントリを登録する
<?xml version="1.0" ?>
<entry xmlns="http://www.w3.org/2005/Atom">
<title>Blog Title</title>
<id>121341341</id>
<updated>2006-08-11T12:13:00Z</updated>
<author><name>Taro Yamada</name></author>
<content>ブログの内容</content>
</entry>
AtomPPが正しくそのリクエストを受け取り、処理を終えた場合、レスポンスとして「201 Created」というレスポンスコードが返ってきます。そしてLocationヘッダーとしてMemberのURIが渡され、同時に作成されたMemberの情報がAtom Feedとして渡されます(リスト17)。
リスト17:Member作成の際のレスポンスデータ
HTTP/1.1 201 Created
Date: Fri, 11 Aug 2006 12:13:23 GMT
Content-Length: 332
Content-Type: application/atom+xml; charset="utf-8"
Content-Location: http://example.org/edit/121341341.atom
Location: http://example.org/edit/121341341.atom
<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
<title>ブログタイトル</title>
<id>121341341</id>
<updated>2006-08-11T12:13:00Z</updated>
<author><name>Taro Yamada</name></author>
<content>ブログの内容</content>
<link rel="edit"
href="http://example.org/edit/first-post.atom"/>
</entry>
この後、作成されたMemberを参照したいときはMemberのURIに対してGETメソッドでアクセスをすればいいですし、削除したい場合はDELETEメソッドでアクセス、編集はPUTメソッドでアクセスして新しい情報を再びAtom Feedで渡すわけです。
なお、MemberやCollectionといった呼び名は現在のAtomPPの最新の仕様に基づいています。古い仕様(バージョン0.3まで)では、アクセスするURIに基づいて、PostURIとFeedURI、EditURIという名前で呼ばれていました。PostURIとFeedURIはCollectionのURI、EditURIはMemberのURIに相当します。古い仕様を利用しているAPIでは、これらの呼び名が使われていることがあります。また、PostURI(POST用)とFeedURI(GET用)が異なるURIになっているケースもあります。
ちなみにここでは触れませんが、AtomPPはSOAPを使うこともできる仕様になっています。
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。