在我的一个控制器中,我正在做一些SSE异步流(参见here),并且我在一个准系统测试项目中工作得很好。在测试项目中,我没有默认的视图集,所以它似乎只是通过 - 完美!
现在我正在尝试将它放入我现有的大型项目中,但是,我发现将它转发到任何视图会使它混乱,我无法弄清楚如何简单地跳过视图的渲染。因为我现在有一个默认视图,所以它拒绝直接通过。
我盲目地尝试了一些事情:$c->detach
,$c->forward(undef)
,覆盖了“结束”方法。没有成功跳过视图渲染 - 它总是将其传递给我的默认视图。
有什么想法吗?
修改
不是超级相关,但有问题的行动:
sub time_server : Path('/events') {
my ( $self, $c ) = @_;
$c->res->content_type('text/event-stream');
$timer_model->( $c, $c->response->write_fh );
}
答案 0 :(得分:4)
Catalyst::Action::Renderview
在决定是否调用视图时使用一小组标准。如果出现以下情况,它将跳过运行视图:
HEAD
请求。$c->response->body
设置为已定义的值。$c->response->status
设置为204("无内容")或任何3xx(重定向)。$c->error
包含一个或多个错误,并且$c->stash->{template}
尚未设置(因此finalize_error
可以完成其工作)。老实说,这不是最好的安排,但我会尝试在你的$c->res->body("");
行动中设置time_server
。一个空的身体不会写任何东西,你的标题已经完成,因为你已经调用了write_fh
,但仍然定义了一个空字符串,这样它就不会让RenderView做任何事情。< / p>
答案 1 :(得分:1)
这是我的解决方案,用于强制使用默认的Catalyst控制器响应JSON类型的功能。您应该将内容类型更改为流。 希望它能对您有所帮助。
sub my_function{
my ( $self, $c ) = @_;
my $payload = {
"yourkey" => "backtooldschool",
"yourkey2" => "2020"
};
my $result = encode_json($payload);
$c->response->body($result);
$c->response->content_type('application/json');
$c->response->status(200);
}