2

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->processPOST リクエストのアクション チェーンの最後にへの呼び出しがないことに注意してください。

.------------------------------------------------------------+-----------.
| 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 のドキュメントを見ると、何もしないデフォルトのデシリアライザーを指定する必要があるように思えますか? しかし、どのように正確に?

助けてくれてありがとう....

4

1 に答える 1

3

私のコントローラークラスに追加__PACKAGE__->config(default => 'text/xml');すると、うまくいくように見えました。

于 2013-08-21T21:10:05.233 に答える