Catalyst で RESTful サーバーを一緒にハッキングしています。これは名目上は厳密な RESTful サービスですが、発信者が受け入れる応答の種類はあまり気にしません。常に、Template Toolkit によってレンダリングされる XML にしたいと考えています。Catalyst::View::TT
そのため、コンテンツタイプを設定してスーパークラスを呼び出すだけの「プロセス」メソッドを備えた独自のビュークラス(に基づく)があります。
sub process {
my ( $self, $c ) = @_;
$c->response->content_type('text/xml; charset=utf-8');
$self->SUPER::process($c);
}
このビュークラスには、構成ブロックにも行があります。これは、私がそのようなことを言うと、拡張子がこのクラスを使用する必要がある"TEMPLATE_EXTENSION => '.tt2'"
ことを Catalyst がどのように認識しているかを推測します(そうでなければ、Catalyst がどのビュークラスをどのように認識しているかわかりません)使用する)。$c->stash->{template} = 'world/view.tt2'
.tt2
また、エンド アクションに 'RenderView' ActionClass を用意して、デフォルトの REST コントローラーの動作 (発信者が受け入れた応答の種類に一致するシリアライザーに委譲する) をオーバーライドし、代わりにデフォルト ビューにフォールスルーします。これは次のように見えますsub end : ActionClass('RenderView') { }
これを GET でテストすると、プロセス メソッドがアクション チェーンの最後に表示され、ビューが正しくレンダリングされます。
.------------------------------------------------------------+-----------.
| Action | Time |
+------------------------------------------------------------+-----------+
| /world/begin | 0.000123s |
| /auto | 0.000139s |
| /world/world_id | 0.268140s |
| /world/view | 0.259048s |
| /world/view_end | 0.000083s |
| /view_end_GET | 0.110241s |
| /world/end | 0.049207s |
| -> Zoo::View::XML->process | 0.048564s |
'------------------------------------------------------------+-----------'
ただし、私の POST 要求はビューをレンダリングしていないようです。デフォルトではContent-type unsupported...
、必要な本文の代わりにエラー メッセージが表示され、415 UNSUPPORTED エラー コードが表示され$c->stash->{template}
ます。Zoo::View::XML->process
POST リクエストのアクション チェーンの最後にへの呼び出しがないことに注意してください。
.------------------------------------------------------------+-----------.
| Action | Time |
+------------------------------------------------------------+-----------+
| /world/begin | 0.030158s |
| /auto | 0.000116s |
| /world/world_id | 0.001228s |
| /world/lock | 0.000915s |
| /world/lock_end | 0.000049s |
| /lock_end_POST | 0.809860s |
| /world/end | 0.000279s |
'------------------------------------------------------------+-----------'
より深く掘り下げると、RenderView アクション$c->response->body
が既に設定されている場合は黙って保釈されるように見えますが、これは (警告メッセージを挿入することによって) POST 要求 (本文が「Content-type unsupported」に設定されている場合)のようであることがわかりました。サブルーチンに到達するまでにエラーメッセージが表示されますlock_end
) が、GET 要求 ($c->response->body
未定義のまま) は表示されません。
POST が応答タイプにうるさいのに、GET はそうではない理由を知っている人はいますか? 要求されたコンテンツ タイプ (またはその欠如) について心配するのをやめるように POST に指示するにはどうすればよいですか? Catalyst::Controller::REST のドキュメントを見ると、何もしないデフォルトのデシリアライザーを指定する必要があるように思えますか? しかし、どのように正確に?
助けてくれてありがとう....