2017-09-16 82 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