14

这个问题与在 Perl 中发出 HTTP GET 请求的最简单方法是什么有关?.

在通过LWP::Simple我发出请求之前,我有一个查询字符串组件的哈希值,我需要对其进行序列化/转义。编码查询字符串的最佳方法是什么?它应该考虑空格和所有需要在有效 URI 中转义的字符。我想它可能在一个现有的包中,但我不知道如何去寻找它。

use LWP::Simple;
my $base_uri = 'http://example.com/rest_api/';
my %query_hash = (spam => 'eggs', foo => 'bar baz');
my $query_string = urlencode(query_hash); # Part in question.
my $query_uri = "$base_uri?$query_string";
# http://example.com/rest_api/?spam=eggs&foo=bar+baz
$contents = get($query_uri);
4

6 回答 6

27

URI::Escape可能是最直接的答案,正如其他人给出的那样,但我建议对整个事情使用URI对象。URI 会自动为您转义 GET 参数(使用 URI::Escape)。

my $uri = URI->new( 'http://example.com' );
$uri->query_form(foo => '1 2', bar => 2);
print $uri; ## http://example.com?foo=1+2&bar=2

作为一个额外的好处,LWP::Simple 的 get函数将把一个URI对象作为它的参数,而不是一个字符串。

于 2009-01-16T02:41:38.493 回答
19

URI::Escape做你想做的事。

use URI::Escape;

sub escape_hash {
    my %hash = @_;
    my @pairs;
    for my $key (keys %hash) {
        push @pairs, join "=", map { uri_escape($_) } $key, $hash{$key};
    }
    return join "&", @pairs;
}
于 2009-01-16T01:29:43.537 回答
5

URI远比URI::Escape这简单得多。方法query_form()接受散列或散列引用:

use URI;
my $full_url = URI->new('http://example.com');
$full_url->query_form({"id" => 27, "order" => "my key"});
print "$full_url\n";     # http://example.com?id=27&order=my+key
于 2014-04-03T16:48:58.873 回答
5

使用模块URI构建带有查询参数的 URL:

use LWP::Simple;
use URI;

my $uri_object = URI->new('http://example.com/rest_api/');
$uri_object->query_form(spam => 'eggs', foo => 'bar baz');

$contents = get("$uri_object");

我在这里找到了这个解决方案。

于 2015-01-16T11:10:24.297 回答
4

请改用 LWP::UserAgent:

use strict;
use warnings;

use LWP::UserAgent;

my %query_hash = (spam => 'eggs', foo => 'bar baz');

my $ua = LWP::UserAgent->new();
my $resp = $ua->get("http://www.foobar.com", %query_hash);

print $resp->content;

它会为您处理编码。

如果您想要更通用的编码解决方案,请参阅HTML::Entities

编辑:URI::Escape是一个更好的选择。

于 2009-01-16T01:36:03.870 回答
2

URI::Escape是您可能正在考虑的模块。

于 2009-01-16T01:32:31.770 回答