我正在 Catalyst 中组装一个 RESTful 服务器。虽然这名义上是一个严格的 RESTful 服务,但我并不真正关心调用者接受的响应类型,我总是希望它是由 Template Toolkit 呈现的 XML;所以我有自己的 View 类(基于Catalyst::View::TT
),带有一个“process”方法,该方法仅设置内容类型并调用父类(super class):
sub process {
my ( $self, $c ) = @_;
$c->response->content_type('text/xml; charset=utf-8');
$self->SUPER::process($c);
}
这个 View 类在配置 block 中也有一行,“TEMPLATE_EXTENSION => '.tt2'”
,我认为这就是当我说类似 $c 时 Catalyst 知道的->stash->{template} = 'world/view.tt2'
那么 .tt2
扩展意味着它应该使用这个类(否则我不确定 Catalyst 如何知道使用什么 View 类)。
我还在结束操作上有一个“RenderView”ActionClass,以覆盖默认的 REST Controller 行为(委托(delegate)给与调用者接受的响应类型匹配的任何序列化程序),而不是转到默认 View 。这看起来就像 sub end : ActionClass('RenderView') { }
当我使用 GET 对此进行测试时,我看到 process 方法出现在操作链的末尾,并且 View 呈现正确:
.------------------------------------------------------------+-----------.
| 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 请求似乎没有渲染 View :默认情况下,我收到 Content-type unsupported...
错误消息,而不是我想要的正文,以及 415不支持的错误代码,即使我设置了 $c->stash->{template}
。请注意,在 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
子例程时,正文被设置为“Content-type unsupported”错误消息),但不是 GET 请求(对于其中 $c->response->body
保持未定义)。
有人知道为什么 POST 对响应类型很挑剔,而 GET 却不是?我如何告诉 POST 不再担心请求的内容类型(或缺少内容类型)?通过查看the Catalyst::Controller::REST documentation看来我可能需要指定一个默认的反序列化器,它什么也不做?但具体如何呢?
感谢您的帮助......
最佳答案
将 __PACKAGE__->config(default => 'text/xml');
添加到我的 Controller 类似乎可以解决问题。
关于perl - 如果未指定内容类型,如何强制 Catalyst::Controller::REST 在 POST 请求之后呈现 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18367289/