gpt4 book ai didi

perl - 如果未指定内容类型,如何强制 Catalyst::Controller::REST 在 POST 请求后呈现 View ?

转载 作者:行者123 更新时间:2023-12-04 04:44:46 25 4
gpt4 key购买 nike

我在 Catalyst 中破解了一个 RESTful 服务器。虽然这名义上是一个严格的 RESTful 服务,但我并不真正关心调用者接受的响应类型,我总是希望它是由 Template Toolkit 呈现的 XML;所以我有自己的 View 类(基于 Catalyst::View::TT ),它带有一个“进程”方法,它只设置内容类型并调用父类(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->stash->{template} = 'world/view.tt2' 之类的内容时,Catalyst 是如何知道这一点的然后 .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 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 |
'------------------------------------------------------------+-----------'

深入挖掘,如果 $c->response->body,RenderView 操作似乎会静默保释。已经设置好了,(通过插入警告消息)我发现它似乎是针对 POST 请求的(当它到达我的 lock_end 子例程时,正文设置为“不支持内容类型”错误消息)但不是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com