14

この質問は、Perl で HTTP GET リクエストを作成する最も簡単な方法は何ですか? .

リクエストを行う前に、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);
4

6 に答える 6

27

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オブジェクトを引数として取ります。

于 2009-01-16T02:41:38.493 に答える
19

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;
}
于 2009-01-16T01:29:43.537 に答える
5

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
于 2014-04-03T16:48:58.873 に答える
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の方が適しています。

于 2009-01-16T01:36:03.870 に答える
2

URI::Escapeは、おそらくあなたが考えているモジュールです。

于 2009-01-16T01:32:31.770 に答える