【发布时间】:2018-03-28 18:29:29
【问题描述】:
所以我正在编写一个简单的 API 服务器,显然 C::C::R 是正确的答案。我有一个动作可以让“事物列表”正常工作:
package stuff::Controller::Thingy;
use Moose;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller::REST'; }
__PACKAGE__->config(namespace => '');
sub thingy : Local : ActionClass('REST') { }
sub thingy_GET :Args(0) :Path("/thingy") {
}
这很好用。还有 HashrefInflator 和 JSON 视图。使代码非常小。
但是!如果我添加第二个动作来获得一个东西,我原来的动作就会停止工作:
sub thingy_GET :Args(1) :Path("/thingy") {
my ( $self, $c, $thingy_id ) = @_;
}
当 plackup 开始时,我得到:
[debug] Loaded Path actions:
.-------------------------------------+--------------------------------------.
| Path | Private |
+-------------------------------------+--------------------------------------+
| /... | /default |
| /bar/thingy/... | /bar/thingy |
| /thingy/* | /thingy_GET |
| /thingy/... | /thingy |
'-------------------------------------+--------------------------------------'
如果我打电话给/thingy,我会得到:
{
"data": []
}
想法?
【问题讨论】:
-
如果我没记错的话,您需要在
sub thingy上添加:Args(n)。sub thingy_GET不能有参数。这不是一个动作,它只是一个潜艇。因此,如果您想要几种不同的行为,您必须实现sub thingy和sub thingies,它们都可以有:Path('/thingy')但不同的:Args(n)。这是我认为是正确的,所以我还没有写出来。我知道如果你想链接其中的几个,你链接sub thingy : ActionClass('REST')位,而不是thingy_GET。此处的行为方式应相同。