Mojolicious通配符占位符和问号

时间:2011-11-29 12:07:34

标签: perl url-routing mojolicious

据说通配符占位符(*)绝对匹配所有内容。 但我担心它不会......

我有一个使用以下方法的网络服务:

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 {

但结果是一样的。

有人知道解决这个问题吗? 或者我应该将其作为错误提交?

此致 洛伦佐

更新 对于有相同问题的人,我已经解决了这个问题:

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);
}

3 个答案:

答案 0 :(得分:2)

?page =它不是网址。

它的参数。

所以这里没有任何错误。 你在$ param中'搜索'了。 并且页面中的$ page = 1。

答案 1 :(得分:1)

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

如果它不起作用,可能将“param”占位符重命名为其他东西有帮助吗?也许这是一个名字冲突。

答案 2 :(得分:1)

请求参数不在存储中。

他们在

$自> req-> PARAMS

所以

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

应该允许您查看您之后的信息