如何在 Perl 中对 HTTP GET 查询字符串进行编码?

发布于 2024-07-12 02:38:49 字数 672 浏览 7 评论 0原文

这个问题与 什么有关在 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);

This question is somewhat related to What’s the simplest way to make a HTTP GET request in Perl?.

Before making the request via LWP::Simple I have a hash of query string components that I need to serialize/escape. What's the best way to encode the query string? It should take into account spaces and all the characters that need to be escaped in valid URIs. I figure it's probably in an existing package, but I'm not sure how to go about finding it.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

残花月 2024-07-19 02:38:49

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 对象作为参数而不是字符串。

URI::Escape is probably the most direct answer, as other have given, but I would recommend using a URI object for the entire thing. URI automatically escapes the GET parameters for you (using 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

As an added bonus, LWP::Simple's get function will take a URI object as it's argument instead of a string.

携余温的黄昏 2024-07-19 02:38:49

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

URI::Escape does what you want.

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;
}
仅此而已 2024-07-19 02:38:49

URIURI::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

URI is far simpler than URI::Escape for this. The method query_form() accepts a hash or a 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
债姬 2024-07-19 02:38:49

使用模块 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");

我找到了这个解决方案 此处

Use the module URI to build the URL with the query parameters:

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

I found this solution here.

只是我以为 2024-07-19 02:38:49

URI::Escape 是您可能正在考虑的模块。

URI::Escape is the module you are probably thinking of.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文