2011-11-29 97 views
2

通配符占位符(*)被称为绝对匹配所有内容。 但我恐怕这不...Mojolicious通配符占位符和问号

我有以下方法webservice的:

get '/*param' => sub { 
    my $self = shift; 
    my $param = $self->stash('param'); 
    $self->app->log->debug($param); 
} 

当我询问我的服务有:http://localhost:3000/search 那么方法日志“搜索”这是确定 但 当我询问我的服务有:http://localhost:3000/search?page=1 那么该方法也记录“搜索”,这是不正常IMO

我也试过更换

get '/*param' => sub { 

get '/:param' => [param => qr/.*/] => sub { 

,但结果是一样的。

有没有人知道解决这个问题的方法? 或者我应该把它作为一个错误?

问候, 洛伦佐

UPDATE 人同样的问题,我解决此问题的工作是这样的:

get '/*path' => sub { 
    my $self = shift; 
    my $path = $self->stash('path'); 

    my @params = $self->param; 
    if (scalar @params > 0) { 
    $path .= '?'; 
    foreach my $param (@params) { 
     $path .= $param . '=' . $self->param($param) . '&'; 
    } 
    $path = substr($path, 0, length($path) - 1); 
    } 

    $self->app->log->debug($path); 
} 

回答

2

页=它不是URL。

其参数。

所以这里没有任何错误。 你有'搜索'在$参数。 而$ page = 1存储。

+0

你的信息我不是确定我明白你在说Korjavin,但通配符占位符应该匹配_everything_(根据文档),而不是。我也确信“?page = 1”部分不在藏品的其他地方。我添加了“$ self-> app-> log-> debug(Dumper $ self> stash);”并且我无法在任何地方找到其余的网址(即?page = 1)! – ldx

1

我认为Korjavin是正确的,这是预期的行为。看起来像“page = 1”作为参数,应该在$ stash-> param('page')中。见GET-POST-parameters in ::Lite

如果它不起作用,也许重命名“参数”占位符到别的东西有帮助?也许这是一个名称冲突。

+0

看来你是对的。我确实在$ self> param中找到'page'。但IMO仍然是一个错误。如果文档声明通配符匹配(并且我在引用)_绝对是一切_那么它应该绝对匹配一切! – ldx

+0

是的,文档现在好多了,但仍然很不完美。猜猜你可以在github上发送补丁请求 –

1

请求参数不在存储器中。

他们在

$自我> req-> PARAMS

所以

my $params = $self->req->params->to_hash; 
    $self->app->log->debug(Dumper $params); 

应该让你看后