PerlでAtomPubサーバを作ろう!
第2回 写真付きブログサーバを作ってWindows Live Writerで書いてみる
前回はエントリリソースを扱うAtomPubサーバを作りました。今回は,前回作成したサーバに画像を扱うコレクションを追加して,写真付きブログサーバに仕上げます。また,Windows Live WriterというAtomPubクライアントを使って,ブログを書いてみます。
サンプルコードはこちらからダウンロードできます。
メディアリソースとは
前回説明したように,AtomPubではエントリや画像ファイルなどを「メンバリソース」と呼び,それらの入れ物を「コレクションリソース」と呼びます。メンバリソースがAtomエントリのときは「エントリリソース」と呼ばれ,それ以外のときは「メディアリソース」のように呼び分けられます。今回はメディアリソースを扱うコレクションを追加します。
エントリリソースの場合と同様に,コレクションのURIにメディアリソースがPOSTされると,サーバはコレクションに追加します。
エントリリソースはXMLなので,著者名などのメタデータを記述できました。しかし,メディアリソースには記述することができません。そこでAtomPubサーバは,メディアリソースを追加するときにペアとなるエントリを作成します。このエントリはメディアリソースへのリンクを持つため,メディアリンクエントリと呼ばれます。図では,実線のボールがメディアリンクエントリで,点線のボールがメディアリソースになります。
コレクションのURIに対してGETが送られると,サーバはメディアリンクエントリを列挙したフィードを返します。
メディアリソースとメディアリンクエントリは,それぞれ別のURIを持ちます。このURI(Edit URI)に対する操作はAtomエントリの場合とほぼ同じです。GETで取得し,PUTで更新,DELETEで削除できます。
メディアリソースかメディアリンクエントリのいずれかが削除されたときは,対応するリソースも削除してください。必ずそうしなければいけないわけではないですが,そのほうが安全です。
テーブルの作成
メディアリソースとメディアリンクエントリを格納するテーブルを作成します。
MyBlog % sqlite3 test.db sqlite> CREATE TABLE medias ( ...> id INTEGER PRIMARY KEY, ...> edited INTEGER, ...> ...> entry_uri TEXT UNIQUE, ...> entry_body BLOB, -- XML ...> ...> media_uri TEXT UNIQUE, ...> media_body BLOB, -- Base64 ...> media_type TEXT ...> );
最初の4カラムは,前回作成したエントリリソース用のテーブルと同じです。entry_uriとentry_bodyには,メディアリンクエントリのURIとXMLが入ります。
最後の3カラムにメディアリソースが格納されます。
media_uriにはメディアリソースのURIが入ります。
media_bodyはメディアリソース本体です。このコレクションで扱うメディアリソースは画像ファイルです。本来はパフォーマンスを高めるために画像サーバなどを用意すべきですが,今回は説明を簡単にするために,Base64エンコードでASCIIに変換してからSQLiteに格納することにします。
media_typeには,メディアリソースのメディアタイプ(image/jpegなど)が入ります。エントリリソースと異なり,メディアリソースの場合はメディアタイプが固定ではありません。HTTPレスポンスを返すときのために記憶しておく必要があります。
PerlでAtomPubサーバを作ろう!
- 第4回 OpenSocialのベースになっているGDataサーバに挑戦
- 第3回 AtomPubをより効果的に ─ 認証・キャッシュなど
- 第2回 写真付きブログサーバを作ってWindows Live Writerで書いてみる
- 第1回 もっとも簡単なAtomPubサーバを作ってみる


