【问题标题】:How can I modify only a part of "query" in URL?如何仅修改 URL 中“查询”的一部分?
【发布时间】:2018-07-18 14:22:36
【问题描述】:

我有一个 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”参数。

我该怎么做?

【问题讨论】:

    标签: perl url mojolicious


    【解决方案1】:

    因为您在 -&gt;query 显式返回的 Mojo::Parameters 对象上调用 -&gt;merge,所以您只能获得 URL 的查询部分。去掉 -&gt;mergeuse an array reference ,它会返回 URL 对象。

    此 URL 的查询部分,数组引用中的键/值对将与 Mojo::Parameters 中的“合并”合并,哈希引用中的键/值对在 Mojo::Parameters 中附加“附加”,默认为 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多