【问题标题】:How do I force Catalyst::Controller::REST to render a view following a POST request, if no content type was specified?如果未指定内容类型,如何强制 Catalyst::Controller::REST 在 POST 请求后呈现视图?
【发布时间】: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,似乎我需要指定一个默认的反序列化器,它什么都不做?但具体如何?

感谢您的帮助....

【问题讨论】:

    标签: perl rest catalyst


    【解决方案1】:

    __PACKAGE__->config(default => 'text/xml'); 添加到我的控制器类似乎可以解决问题。

    【讨论】:

    • http://search.cpan.org/~bobtfish/Catalyst-Action-RenderView-0.16/lib/Catalyst/Action/RenderView.pm 中的文档说它应该是 __PACKAGE__->config(default_view => 'text/xml');
    • @ViniciusJoséLatorre 这是针对 C:A:RenderView 的,这个问题在 C:A:REST 上
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多