如何在Perl中编码HTTP GET查询字符串?

时间:2009-01-16 01:08:46

标签: perl http escaping uri

此问题与What’s the simplest way to make a HTTP GET request in Perl?有些相关。

在通过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);

6 个答案:

答案 0 :(得分:26)

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's 获取函数将使用URI对象作为其参数而不是字符串。

答案 1 :(得分:18)

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

答案 2 :(得分:5)

URIURI::Escape简单得多。方法query_form()接受散列或hashref:

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

答案 3 :(得分: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");

我找到了这个解决方案here

答案 4 :(得分: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是更好的选择。

答案 5 :(得分:2)

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