Как кодировать строки HTTP GET в Perl?
Этот вопрос несколько связан с Самый простой способ сделать 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);
Ответы
Ответ 1
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
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 получит URI в качестве аргумента вместо строки.
Ответ 3
Вместо этого используйте 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.
EDIT: URI:: Escape - лучший выбор.
Ответ 4
URI гораздо проще, чем URI::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
Ответ 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");
Я нашел это решение здесь.
Ответ 6
URI::Escape - это модуль, о котором вы, вероятно, думаете.