最近のプロジェクトでは、新しいResourceURI構成設定を実装するカスタム構成ハンドラーを作成しました。これにより、次のように構成行をhttpd.confに配置できます。
ResourceURI SomeResource GET,POST,DELETE "^/...$"
3つの引数は、私のリソースクラス名、リソースが応答できるHTTPメソッドのリスト、およびリソースのURIに一致する正規表現です。
カスタム構成クラスは、これらの各行を次のようなブロックに置き換えます。
PerlModule Handler::{resource class}
PerlModule Resource::{resource class}
<Location ~ "{uri regex}">
Order allow,deny
Allow from all
<LimitExcept {allowed methods}>
Order deny,allow
Deny from all
</LimitExcept>
SetHandler modperl
PerlHandler Handler
PerlSetVar Resource {resource class}
</Location>
これにより、クラスの読み込みが処理され、Apacheが無効なメソッドを拒否し、ルーティング先のリソースを示すフラグを設定し、すべてのリクエストをHandler :: handler()関数に渡します。
package Handler;
sub handler {
my $r = shift;
my $resource_class = 'Resource::' . $r->dir_config('Resource');
my $handler_class = 'Handler::' . $r->dir_config('Resource');
my $resource = $resource_class->new($r, $r->uri);
return Apache2::Const::HTTP_NOT_FOUND unless $resource;
my $method = $r->method();
return Apache2::Const::HTTP_NOT_IMPLEMENTED
unless $handler_class->can($method);
return $handler_class->$method($r, $resource);
}
ここで、リソースロジック(表現のフォーマット方法を含む)を使用してResource :: *クラスを実装し、GET、HEAD、POSTなどの名前のメソッドを使用してHandler :: *クラスを実装し、$rと$resourceを使用して処理する必要があります。リクエスト。
必要な新しいリソースごとに、1行の構成を追加し、1つのHandlerクラス(多くの場合、汎用基本クラスから継承するほとんど空のモジュールである可能性があります)を実装し、コード。また、別のリソースのリクエストを処理するコンテキストで、1つのリソースオブジェクトを作成する必要があることもよくあります。そのため、私のリソースコンストラクターは、$ rからURIを取得するだけでなく、URIに対して別の引数を取ります。Resource :: Fooにいて、Resource :: Barオブジェクトが必要な場合は、$ bar = Resource :: Bar-> new($ r、'/ bars / 1234');と言うことができます。これは、クライアントが使用するのと同じURIを使用してBarオブジェクトを作成します。