Hatena::Groupcatalyst

masaki@catalyst RSSフィード

Fork me on GitHub
 | 

2008-04-20

ROA と Catalyst

| 23:33 | ROA と Catalyst - masaki@catalyst を含むブックマーク はてなブックマーク - ROA と Catalyst - masaki@catalyst ROA と Catalyst - masaki@catalyst のブックマークコメント

ROA と Catalyst の関係について考えるために,まずは ROA の特性についてをまとめておく.

アドレス可能性 (Addressability)
アプリケーションのデータセットを参照可能なリソースとして URI を通じて公開すること.すべてのページ(=リソース)に一意なアドレスが存在すると,ページをブックマークしたり,他のページからリンクしたり,URI をメールで送信したりできる.このときリソースの URI は構造的で予測可能であることが望ましく,それによってクライアントはリソースを利用しやすくなるというメリットがある.
ステートレス性 (Statelessness)
すべての HTTP リクエストが完全に独立していること.クライアントが送信する HTTP リクエストは,サーバがそのリクエストを処理するのに必要な情報がすべて含められた自己記述的メッセージ (Self-Describing Messages) となる.アドレス可能性から見ると,ステートレス性とはサーバ状態もリソースであって独自の URI が割り当てられることである.ここでサーバ状態はアプリケーション状態とリソース状態に分類される.アプリケーション状態とはサーバがリクエストを処理するのに必要な情報で,例えば検索結果リソースへのクエリ (?q=xxx) だったりページング状態 (?start=10) などである.アプリケーション状態はクライアントで維持されるもので,もちろんクライアントごとに異なるものである.一方リソース状態はクライアント共通のもので,サーバに格納される.例えばアップロードして URI が割り当てられた画像リソースがあるとき,この画像は様々なクライアントから共通に取得できる.この画像がリソース状態であり,サーバに格納されるものである.
接続性 (Connectedness)
Roy Fielding が言う「アプリケーション状態エンジンとしてのハイパーメディア」のことで,簡単に言うとリソースがリンクを持つということ.ハイパーメディアとは一般にハイパーリンクとフォームのことで,ユーザがハイパーリンクをたどるかフォームに記入するだけで別の状態へ移行,すなわちアプリケーション状態を遷移させる.Web が使いやすい要因の一つは,例えばユーザが設定した「ホームページ」から検索フォームやカテゴリのリンクによって様々に移動できるよう,Web 上のリソースが接続されているから.
統一インターフェイス (Uniform Interface)
HTTP メソッドを GET/POST/PUT/DELETE で CRUD 操作というように同じ方法で使用する.POST は従属リソースあるいは従属情報の作成に用いるものであるが,現実には特定のデータを処理するための汎用メソッドとして使われている.この使い方をオーバーロード POST と呼ぶが,これによってメソッド情報が HTTP メソッドから欠落し,統一インターフェイスではなくなってしまう.

さて,この中で「接続性」を満たすにはリソース表現に適切なリンクを含めるように設計する必要がある.そしてこれはサービス実装者が提供する View (HTML, XML, JSON, Atom, ...) において適切なリンクを含めるようにすることで満足されるため,Catalyst 特有の何かがあるわけではないと考える.

「統一インターフェイス」を満足して Catalyst でアプリケーションを作成するには

  • GET/POST/PUT/DELETE によって適切に処理を行うようアプリケーションを実装する.
  • かつ,特定のメソッドをサポートしないクライアントには代替手段を提供する.
    • このとき Catalyst 側から見て,代替手段を用いたときと本来のメソッドとの間でアクションが違うと面倒なので,吸収できることが望ましい.

というあたりを押さえる必要がある.このうち特定メソッドの代替手段とその吸収については,統一インターフェイスと PUT and DELETE tunneled POST パターン - masaki@catalyst - Catalystグループ にある方法で解決する.また HTTP メソッドによって適切に処理を切り替えるようにコントローラを作るには,Catalyst::Controller::ResourcesCatalyst::Controller::Resources の使い方 - masaki@catalyst - Catalystグループ)を使うか,あるいは Catalyst::Action::REST を使うという選択肢がある.

「アドレス可能性」と「ステートレス性」に関しては,やはりリソースの名前 (URI) を適切に考慮してコントローラを設計する必要がある.Catalyst では今時の WAF らしく URI とコントローラアクションがマッピングされる仕組みになっているから,URI を構造的に組み立てた上でそれに合わせたコントローラを作っていくという方法が取れる.この場合も Catalyst::Controller::Resources を使うと構造的なコントローラを比較的容易に作ることができる.

なお,リソースの表現という重要な概念に関しては別途言及する.

bqjelofhbqjelofh2011/03/23 22:36eMbc4S <a href="http://lrsrbvtvtazm.com/">lrsrbvtvtazm</a>, [url=http://pyikncyuaoto.com/]pyikncyuaoto[/url], [link=http://bulrykwoioob.com/]bulrykwoioob[/link], http://gvzfyolqkibh.com/

トラックバック - http://catalyst.g.hatena.ne.jp/ikasam_a/20080420
 |