我在 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 文档,似乎我需要指定一个默认的反序列化器,它什么都不做?但具体如何?
谢谢你的帮助......