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

标签 perl rest catalyst

我正在 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/

相关文章:

perl - 旧 TPJ 文章中的 8 queen 问题缺少到主模块 Queen 的链接

MySQL 查询帮助——忽略查询中的空值(使用 PERL 和 Regex)

python - 通过 RESTful API 使用 python 与 MOXA ioLogik1214 进行连接,以将数据放入 DO 端口

java - Spring Data Rest 2.0.0 - @RestResource (exported=false) 不适用于属性

perl - 为什么我的 Catalyst 应用程序无法读取我的 Template Toolkit 文件?

perl - 如何为 Catalyst 中的每个响应设置 Cache-Control header ?

perl - 想要在 Perl 中通过 IPv6 链接本地 IP 发送 UDP 数据包

php - 如何在yii2中设置restful api的分页?

perl - DBIx::Class 包装/重载列访问器

node.js - Express.js 是否支持发送无缓冲的渐进式刷新响应?