如何仅修改URL中“查询”的一部分?

时间:2018-07-18 14:22:36

标签: perl url mojolicious

我有一个Mojo应用。我有一个来自“ a”标签的URL列表。我想 向其中每个添加一些查询参数,或者修改其中的现有查询参数(如果它们已经存在于该URL中)。 URL的其余部分必须保持不变。 这是我的操作方式:

  $doc->find('a')->each(sub {
    my $aTag = $_;
    my $aUrl = Mojo::URL->new($aTag->attr('href'));
    my $newUrl = $aUrl->query->merge('q_key1' => 'something', 'q_key2' => 'something2'); # <--- warn: returns only the query part, removes the "path" part
    $_->attr('href' => $newUrl->to_string);
  });  

问题在于,它仅返回查询部分,并在存在时删除“路径”部分。

我想要所有这些内容:路径,域,原型等...-我只想添加/修改查询部分,并且只添加/修改“ q_key1”和“ q_key1”参数。

我该怎么做?

1 个答案:

答案 0 :(得分:6)

因为您在->merge显式返回的Mojo :: Parameters对象上调用->query,所以您仅获得URL的查询部分。改掉->mergeuse an array reference,它将返回URL对象。

  

查询该URL的一部分,数组引用中的键/值对将与Mojo :: Parameters中的“合并”合并,而哈希引用中的键/值对将在Mojo :: Parameters中附加“ append”,默认为Mojo :: Parameters对象。

这就是您想要的。

use Mojo::URL;

my $url = Mojo::URL->new('http://example.org/foo?bar=test&q_key1=asdf');
my $new_url = $url->query( 
    [ 
        'q_key1' => 'something',
        'q_key2' => 'something2',
    ]
);
say $new_url->to_string;

输出:

http://example.org/foo?bar=test&q_key1=something&q_key2=something2

请注意,这不是副本,而是具有更新值的同一对象。您无需将其分配给$new_url