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

ty

我有一个Mojo应用程序。我有一个来自“ a”标签的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”参数。

我怎样才能做到这一点?

津巴布韦

因为您调用显式返回->merge的Mojo :: Parameters对象,所以->query您仅获得URL的查询部分。摆脱->merge使用数组引用代替,它将返回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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章