Pergunta

Esta questão é algo relacionado a Qual é a maneira mais simples de fazer uma solicitação HTTP GET em Perl? .

Antes de fazer o pedido via LWP::Simple Eu tenho um hash de componentes de cadeia de consulta que eu preciso para serializar / fuga. Qual é a melhor maneira de codificar a seqüência de consulta? Deve ter em conta espaços e todos os personagens que precisam ser escaparam em URIs válidos. Eu acho que é provavelmente em um pacote existente, mas Eu não tenho certeza de como proceder para encontrar-lo.

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);
Foi útil?

Solução

URI :: Fuga faz o que quiser.

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

Outras dicas

URI :: Fuga é provavelmente o mais direto responder, como outros têm dado, mas eu recomendo usar um href="http://search.cpan.org/~gaas/URI/" rel="noreferrer"> URI objeto

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

Como um bônus adicional, LWP :: Simple é < em> get função terá um objeto URI como é argumento em vez de um corda.

URI é muito mais simples do que URI::Escape para isso. O método query_form () aceita um hash ou um 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

Use o módulo URI para construir a URL com os parâmetros de consulta:

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");

Eu encontrei esta solução aqui .

Use LWP :: UserAgent vez:

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;

Ela cuida da codificação para você.

Se você quer uma solução de codificação mais genérico, consulte HTML :: Entities .

EDIT: URI :: Fuga é uma melhor escolha.

URI :: Fuga é o módulo que você provavelmente está pensando.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top