Hatena::Groupcatalyst

masaki@catalyst RSSフィード

Fork me on GitHub
 | 

2008-04-19

統一インターフェイスと PUT and DELETE tunneled POST パターン

| 02:42 | 統一インターフェイスと PUT and DELETE tunneled POST パターン - masaki@catalyst を含むブックマーク はてなブックマーク - 統一インターフェイスと PUT and DELETE tunneled POST パターン - masaki@catalyst 統一インターフェイスと PUT and DELETE tunneled POST パターン - masaki@catalyst のブックマークコメント

HTTP の場合,統一インターフェイスとは HTTP メソッドのことで,特に一般的な操作に対して以下の4つが規定されている.

  • GET - リソースの表現を取得する
  • POST - リソースを作成する
  • PUT - リソースを変更する
  • DELETE - リソースを削除する

ROA 的にはこのような決まったインターフェイスでリソースの操作をするといいわけだが,Web アプリケーションの場合相手になるクライアントは(主に)Web ブラウザで,これが往々にして PUT/DELETE などをサポートしていないため,そのようなメソッド相当の処理も全部 POST で行うという現状がある.

ここで,Web アプリケーションというより Web システムという概念で考えると,クライアントは Web ブラウザだけではなく例えば PUT/DELETE もサポートしている専用クライアントということもあり得る.そうなると Web システムでは,PUT リクエストまたは PUT 相当にするために何らかのパラメータを付けた POST リクエストも同じアクションで扱える方がスマートだ.

Catalyst の場合も同様に,PUT tunneled POST リクエストはアクション判定と起動前に PUT に置き換えてしまうのが一番楽な方法になる.

rails を参考にすると,_method というパラメータ付きの POST リクエストの場合は,リクエストメソッドを _method パラメータの値にするという処理が行われている.これを Catalyst に持ってくるとこんな感じになる.

sub prepare_action {
    my $c = shift;

    if (exists $c->req->params->{_method} and $c->req->method eq 'POST') {
        $c->req->method(lc $c->req->params->{_method});
    }

    $c->NEXT::prepare_action(@_);
}

前置きが長かったけど,こんなちょっとしたことでもやるのとやらないのでは,コントローラの設計に結構響いたりするから怖い.

Catalyst REST Practice #0

| 01:13 | Catalyst REST Practice #0 - masaki@catalyst を含むブックマーク はてなブックマーク - Catalyst REST Practice #0 - masaki@catalyst Catalyst REST Practice #0 - masaki@catalyst のブックマークコメント

リソース指向アーキテクチャ (ROA) の特性は以下の4つ.

  • アドレス可能性 (Addressability)
  • ステートレス性 (Statelessness)
  • 接続性 (Connectedness)
  • 統一インターフェイス (Uniform Interface)

これらの特性や,ROA の核であるリソースにおける

  • リソースの名前
  • リソースの表現
  • リソース間のリンク

を実現するために Catalyst からどのようなアプローチが取れるかを考えたい.

ちなみに接続性というのは簡単に言うとリンクを持つということで,リソース間のリンクというのはその接続性のもとであるリソース(表現)に他のリソースへのリンクを持つということ.なのでこれらはリソース表現がリンクを持つように設計するべし,という指針であるので Catalyst でどうするかという話はしない.

Controller::Resources 0.03 released

| 00:36 | Controller::Resources 0.03 released - masaki@catalyst を含むブックマーク はてなブックマーク - Controller::Resources 0.03 released - masaki@catalyst Controller::Resources 0.03 released - masaki@catalyst のブックマークコメント

typesterさんのコミットからちょっと変更したけど,おかげさまで deep namespace サポートできたので CPAN にあげた.

ただ,その後で MANIFEST 変更してなかったために新しいテストファイルが付いていないことに気がついた.失態.

まぁともかくこんな事ができるようになりました.

package MyApp::Controller::API::Items;
use base 'Catalyst::Controller::Resources';

# GET /api/items/{item_id}
sub show {
    my ($self, $c, $item_id) = @_;
}

こいつに更にネストさせるのもできます.

package MyApp::Controller::API::Items::Orders;
use base 'Catalyst::Controller::Resources';

__PACKAGE__->config( belongs_to => 'API::Items' );

# GET /api/items/{item_id}/orders/{order_id}
sub show {
    my ($self, $c, $item_id, $order_id) = @_;
}
トラックバック - http://catalyst.g.hatena.ne.jp/ikasam_a/20080419
 |