2017-09-16 76 views
0

如果请求发生,我会从Web服务器获取HTTP :: Request对象。我只在URL中看到GET-query-parameters,或者它是来自标题中的POST。Perl HTTP :: Request - 解析查询参数的最佳方式

有没有一种方法HTTP :: Request或任何其他包以一种很好的方式给我这些参数(例如哈希),我不需要自己解析它?

例如GET http://example.net?a=3&b=jack

我不想从URL或HTTP-Header(如果POST)手动解析它,而是想要访问(= 3)和b(= jack)的值。

谢谢!

编辑

感谢有关包URI的好建议。它完美适用于URL中的参数。

但不适用于POST参数在主体中。我为此调整了它。

if ($req->method eq "POST")  # $req is HTTP::Request 
{   { 
    my $uri = URI->new ("/whatever?" . $req->content); # not very pretty 
    %params = $uri->query_form(); 
    ... 

得到相同的结果。你认为这是一个好主意,还是有更好 - 更直的方式?

+2

https://metacpan.org/pod/URI::QueryParam,https://metacpan.org/pod/CGI –

回答

1
use List::Util qw(pairs); # Version 1.29+ 
use URI  qw(); 

my $uri = URI->new($request->uri); 

# If none of the parameters can have multiple values. 
# Usage: my $value = $params{$key}; 
my %params = $uri->query_form(); 

# If some of the parameters can have multiple values. 
# Usage: my $value = $params{$key}[0]; 
# Usage: my @values = @{ $params{$key} }; 
my %params; 
for my $pair (pairs $uri->query_form()) { 
    my ($key, $value) = @$pair; 
    push @{ $params{$key} }, $value; 
} 

URI::QueryParam补充说,似乎是在这种情况下(query_paramquery_form_hash)方便,但是太容易出错的使用方法$uri