【发布时间】:2013-08-21 20:42:27
【问题描述】:
我在 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' 时,.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 错误代码,即使我设置了 @987654330 @。请注意在 POST 请求的操作链末尾缺少对 Zoo::View::XML->process 的调用:
.------------------------------------------------------------+-----------.
| 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 |
'------------------------------------------------------------+-----------'
深入研究,如果 $c->response->body 已经设置,看起来 RenderView 操作将静默保释,这(通过插入警告消息)我发现它似乎是针对 POST 请求(其中主体设置为到达我的lock_end 子例程时出现“不支持内容类型”错误消息)但不是 GET 请求($c->response->body 仍未定义)。
有谁知道为什么 POST 对响应类型很挑剔,而 GET 则不然?我怎样才能告诉 POST 停止担心请求的内容类型(或缺少它)?通过查看the Catalyst::Controller::REST documentation,似乎我需要指定一个默认的反序列化器,它什么都不做?但具体如何?
感谢您的帮助....
【问题讨论】: