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 如何知道当我说类似$c->stash->{template} = 'world/view.tt2'then.tt2扩展意味着它应该使用这个类(否则我不确定 Catalyst 怎么知道什么视图类使用)。

我在结束操作上还有一个“RenderView”ActionClass,以覆盖默认的 REST 控制器行为(它委托给与调用者接受的响应类型匹配的任何序列化程序),而是进入默认视图。这看起来像sub end : ActionClass('RenderView') { }

当我使用 GET 进行测试时,我看到 process 方法出现在操作链的末尾,并且视图正确呈现:

.------------------------------------------------------------+-----------.
| 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 请求(其中主体设置为“不支持的内容类型”到达我的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 回答