【问题标题】:Perl HTTP::Request - best way to parse the query-paramtersPerl HTTP::Request - 解析查询参数的最佳方式
【发布时间】:2017-09-16 18:37:15
【问题描述】:

如果发生请求,我会从网络服务器获取对象 HTTP::Request。我只在 URL 中看到 GET-query-parameters,或者它来自标头中的 POST。

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

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

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

谢谢!

编辑

感谢有关包 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 ();
  ...

获得相同的结果。您认为这是个好主意还是有更好、更直接的方法?

【问题讨论】:

标签: perl http


【解决方案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$uri 添加了在这种情况下看起来很方便的方法(query_paramquery_form_hash),但使用起来太容易出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 2012-04-24
    • 2015-10-07
    • 2014-09-02
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多