Как мне кодировать строки HTTP GET-запроса в Perl? - PullRequest
13 голосов
/ 16 января 2009

Этот вопрос в некоторой степени связан с Какой самый простой способ сделать HTTP-запрос GET в 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 ]

26 голосов
/ 16 января 2009

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 в качестве аргумента вместо строки.

18 голосов
/ 16 января 2009

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;
}
5 голосов
/ 16 января 2015

Используйте модуль 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");

Я нашел это решение здесь .

5 голосов
/ 03 апреля 2014

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
4 голосов
/ 16 января 2009

Вместо этого используйте 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 является лучшим выбором.

2 голосов
/ 16 января 2009

URI :: Escape - это модуль, о котором вы, вероятно, думаете.

...