Domanda

Questa domanda è in qualche modo correlata a Qual è il modo più semplice per effettuare una richiesta HTTP GET in Perl? .

Prima di effettuare la richiesta tramite LWP :: Simple ho un hash di componenti di stringa di query che devo serializzare / scappare. Qual è il modo migliore per codificare la stringa di query? Dovrebbe tenere conto degli spazi account e di tutti i caratteri che devono essere salvati in URI validi. Immagino che sia probabilmente in un pacchetto esistente, ma non sono sicuro di come trovarlo.

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);
È stato utile?

Soluzione

URI :: Escape fa quello che vuoi.

use URI::Escape;

sub escape_hash {
    my %hash = @_;
    my @pairs;
    for my $key (keys %hash) {
        push @pairs, join "=", map { uri_escape(

URI :: Escape fa quello che vuoi.

<*>) } $key, $hash{$key}; } return join "&", @pairs; }

Altri suggerimenti

URI :: Escape è probabilmente il più diretto risposta, come altri hanno dato, ma consiglierei di utilizzare un oggetto URI per l'intera cosa . L'URI elimina automaticamente i parametri GET (usando 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

Come bonus aggiuntivo, LWP :: Simple's < em> get prenderà un oggetto URI come argomento invece che un stringa.

URI è molto più semplice di URI :: Escape per questo. Il metodo query_form () accetta un hash o un 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

Utilizza il modulo URI per creare l'URL con i parametri della query:

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

Ho trovato questa soluzione qui .

Usa invece 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;

Si occupa della codifica per te.

Se vuoi una soluzione di codifica più generica, vedi HTML :: Entities .

EDIT: URI :: Escape è meglio scelta.

URI :: Escape è il modulo a cui probabilmente stai pensando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top