前回はエントリリソースを扱うAtomPubサーバを作りました。今回は、前回作成したサーバに画像を扱うコレクションを追加して、写真付きブログサーバに仕上げます。また、Windows Live WriterというAtomPubクライアントを使って、ブログを書いてみます。
サンプルコードはこちらからダウンロードできます。
メディアリソースとは
前回説明したように、AtomPubではエントリや画像ファイルなどを「メンバリソース」と呼び、それらの入れ物を「コレクションリソース」と呼びます。メンバリソースがAtomエントリのときは「エントリリソース」と呼ばれ、それ以外のときは「メディアリソース」のように呼び分けられます。今回はメディアリソースを扱うコレクションを追加します。
エントリリソースの場合と同様に、コレクションのURIにメディアリソースがPOSTされると、サーバはコレクションに追加します。
エントリリソースはXMLなので、著者名などのメタデータを記述できました。しかし、メディアリソースには記述することができません。そこでAtomPubサーバは、メディアリソースを追加するときにペアとなるエントリを作成します。このエントリはメディアリソースへのリンクを持つため、メディアリンクエントリと呼ばれます。図では、実線のボールがメディアリンクエントリで、点線のボールがメディアリソースになります。
コレクションのURIに対してGETが送られると、サーバはメディアリンクエントリを列挙したフィードを返します。
メディアリソースとメディアリンクエントリは、それぞれ別のURIを持ちます。このURI(Edit URI)に対する操作はAtomエントリの場合とほぼ同じです。GETで取得し、PUTで更新、DELETEで削除できます。
メディアリソースかメディアリンクエントリのいずれかが削除されたときは、対応するリソースも削除してください。必ずそうしなければいけないわけではないですが、そのほうが安全です。
テーブルの作成
メディアリソースとメディアリンクエントリを格納するテーブルを作成します。
最初の4カラムは、前回作成したエントリリソース用のテーブルと同じです。entry_uriとentry_bodyには、メディアリンクエントリのURIとXMLが入ります。
最後の3カラムにメディアリソースが格納されます。
media_uriにはメディアリソースのURIが入ります。
media_bodyはメディアリソース本体です。このコレクションで扱うメディアリソースは画像ファイルです。本来はパフォーマンスを高めるために画像サーバなどを用意すべきですが、今回は説明を簡単にするために、Base64エンコードでASCIIに変換してからSQLiteに格納することにします。
media_typeには、メディアリソースのメディアタイプ(image/jpegなど)が入ります。エントリリソースと異なり、メディアリソースの場合はメディアタイプが固定ではありません。HTTPレスポンスを返すときのために記憶しておく必要があります。
コレクションコントローラの作成
ヘルパスクリプトを使って、コントローラクラスのひな形を作成します。引数の意味は前回と同じです。
前回のエントリコレクションと同じように、メンバリソースの列挙(List)と CRUD を行う5つのメソッドを実装します。
メンバの列挙(List)
列挙は前回のコレクションとほぼ同じです。フィードのひな型を取得し、メディアリンクエントリを追加します。
メンバの追加(Create)
前回作成したエントリコレクションはエントリのみを格納しましたが、今回はメディアリソースとメディアリンクエントリの両方を格納します。
このメソッドが呼ばれる前に、スーパークラスはメディアリンクエントリを生成します。
このメソッドでは、メディアリソースとメディアリンクエントリを受け取り、データベースに格納します。テーブルの説明で触れたように、メディアリソースはBase64エンコードして格納することにします。
メンバの取得(Read)
メディアリソースを扱うコレクションでは、リクエストされたURIがメディアリソースかメディアリンクエントリかを判定する必要があります。ここでは、OR検索でレコードを取得した後に、URIを照合して判定します。その後、該当するリソースをセットします。
メンバの更新(Update)
メンバの取得と同様に、リクエストされたURIに対応するレコードを検索し、更新対象がメディアリソースかメディアリンクエントリかを判定します。その後、更新するカラムに値を設定し、更新を行います。
更新対象がメディアリンクエントリのときは、メディアリンクエントリのみを更新します。更新対象がメディアリソースのときは、メディアリンクエントリの更新日時タグ(app:edited)を更新するのを忘れないようにしてください。
メンバの削除(Delete)
メンバの取得と同様に、リクエストされたURIに対応するレコードを検索します。リソースが見つかったら、メディアリソースとメディアリンクエントリをまとめて(つまりレコードごと)削除します。
以上でメディアリソースを扱うコレクションの実装が終わりました。
コレクションの設定
デフォルトでは、コレクションコントローラはエントリリソースを扱うように設定されます(このため、前回は設定不要でした)。メディアリソースを扱うときは、そのメディアタイプを指定する必要があります。エントリリソースのコレクションでは、オプションとしてカテゴリを指定することができます。設定はCatalystの設定ファイル(myblog.yaml)で行います。
エントリリソースを扱うコレクションの設定
エントリリソースのコレクションでは、カテゴリを指定することができます。カテゴリとは、ソーシャルブックマークなどで「タグ」と呼ばれる一種のジャンル情報です。
このように設定すると、animal,vegetable,mineralという3つのカテゴリのみが許可されるようになります。fixedは、指定したカテゴリ以外を受け付けないという意味です。fixedを指定しなければ、任意のカテゴリを受け付けます。
Atomのカテゴリには、カテゴリの衝突(同音異義語のこと)を解決するためにschemeという仕組みがありますが、ここでは割愛します。
ここでは、コレクションのタイトルも指定しています。これはフィードのタイトルとして使われます。指定しなければ、パッケージ名のControllerより後ろの部分(この例ではEntryCollection)がタイトルとして使われます。
メディアリソースを扱うコレクションの設定
メディアリソースのコレクションでは、許可するメディアタイプを指定することができます。
ここでは、画像を表す3種類のメディアタイプを設定しました。メディアタイプはimage/*のようにワイルドカードで指定することもできます。
サービス文書コントローラの作成
コレクションの設定情報をクライアントに公開します。AtomPubでは、サービス文書というXML文書を使ってコレクションの情報を公開することができます。サービス文書についての説明は省略しますが、上のコレクション設定がほぼそのままXMLになっていると考えてもらって問題ありません。
ヘルパスクリプトを使って、サービス文書のコントローラを作成します。
コレクションと異なり、サービス文書のコントローラには実装しなければならないメソッドはありません。スーパークラス(Catalyst::Controller::Atompub::Service)が各コレクションの設定を読み取り、自動的にサービス文書を生成します。http://localhost:3000/serviceにアクセスすると、サービス文書を取得できます。
HTMLコントローラの作成
もう一息です。HTMLを表示するためのコントローラを作成して、ブログっぽくみせます。
ヘルパスクリプトを使ってコントローラを作成します。
コマンドを実行すると、lib/MyBlog/Controller/Html.pmが作成されます。エントリを取得し、タイトルや本文をテンプレート用のデータ領域にセットします。
トップページへのアクセスは /html にリダイレクトしておきます。
ビューの作成
ヘルパスクリプトを使ってビューを作成します。
テンプレートを作成し、先ほどセットしたデータをHTMLとして表示します。
これで写真付きブログサーバの完成です。Catalystを起動してhttp://localhost:3000/htmlにアクセスすると、My Blogというタイトルのページが表示されます。
Windows Live Writer で投稿してみる
Windows Live Writer というAtomPubクライアントを使って、ブログに記事を投稿してみます。
Windows Live Writerはhttp://writer.live.com/からダウンロードできます。インストールが完了するとウィザードが始まりますので、以下のように進めてください。
- ようこそ!というダイアログでは、「ブログを持っている」を選択してください。ブログ種類の選択では、「他のブログサービス」を選びます。
- ブログのホームページとログインでは、URLにhttp://<server>:3000/serviceを入力してください。ユーザー名とパスワードはまだ使わないので、適当に埋めておいてください。
- プロバイダの選択では、「Atom Publishing Protocol」を選択し、Service DocumentのURLに「http://<server>:3000/service」を入力します。
- 仮の記事の作成を有効にしますか?と尋ねられたら、「いいえ」を選んでください。
- 画像コレクションの選択では、「My Blog - Photo」を選択します。最後に「完了」をクリックします。
以上でウィザードが終了し、Windows Live Writerが起動します。
タイトルと本文に何か記入して(文字の拡大や色の変更もできます)、「投稿」ボタンをクリックしてください。Internet Explorerが起動し、投稿した記事が表示されると思います(表示されないときは、再読込してください)。
続いて、メニューから「挿入 - 画像」を選んで、画像ファイルを追加し、投稿してください。ブログに画像が貼り付けられます。
この連載では簡単なブログサーバを実装しただけですが、リッチテキストや画像を使ってブログを書くことができました。AtomPubが普及すると、クライアントを自由に選べるようになったり、サービス間の連携が容易になると考えられます。