【问题标题】:Mojolicious wildcard placeholders and question markMojolicious 通配符占位符和问号
【发布时间】:2011-11-29 12:07:34
【问题描述】:

通配符占位符 (*) 可以完全匹配所有内容。 但我担心它不会......

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

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

【问题讨论】:

    标签: perl url-routing mojolicious


    【解决方案1】:

    ?page= 它不是 url。

    它的参数。

    所以这里没有任何错误。 您在 $param 中有“搜索”。 并且 $page=1 在存储中。

    【讨论】:

    • 我不确定我是否理解你在说什么 Korjavin,但通配符占位符应该匹配 everything (根据文档),但事实并非如此。我也确定“?page=1”部分不在藏匿处的其他地方。我添加了“$self->app->log->debug(Dumper $self->stash);”而且我在任何地方都找不到其余的网址(即?page=1)!
    【解决方案2】:

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

    如果它不起作用,也许将“param”占位符重命名为其他内容会有所帮助?也许是名字冲突。

    【讨论】:

    • 看来你是对的。我确实在 $self->param 中找到了“页面”。但是IMO这仍然是一个错误。如果文档声明通配符匹配(并且我正在引用)absolutely everything,那么它应该真的完全匹配所有内容!
    • 是的,文档现在更好了,但仍远非完美。猜猜你可以在 github 上发送补丁请求
    【解决方案3】:

    请求参数不会在存储中。

    他们在

    $self->req->参数

    所以

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

    应该让你看到你所追求的信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 2011-08-24
      • 2021-08-24
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多