【问题标题】:Perl LWP:UserAgent how to I add headers?Perl LWP:UserAgent 如何添加标题?
【发布时间】:2016-12-01 05:48:38
【问题描述】:

我是一名新的 perl 程序员,尝试使用 LWP:UserAgent 将 curl 请求转换为 Perl 脚本。

curl 请求示例为:

curl -X GET -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "Cache-Control: no-cache" -H "Postman-Token: eb3955f1-a7b5-65d7-f5c0-808c7aba6cef" "https://10.51.10.26/10/download?startTime=1461698250&endTime=1461698252&cNat=True&cNatShowDst=True&tuplesFile=True&summarizeTuples=False"

还有我的 PERL 等价物:

use LWP::UserAgent;
my $browser = LWP::UserAgent->new;
my $url = 'https://10.51.10.26/10/download';
my @headers = (
   "startTime" => $queryStart, 
   "endTime" => $queryEnd, 
   "cNat" => "True", 
   "cNatShowDst" => "False", 
   "tuplesFile" => "False", 
   "summarizeTuples" => "False",
   "Authorization" => "Basic YWRtaW46YWRtaW4",
   "Cache-Control" => "no-cache", 
   "Postman-Token" => "eb3955f1-a7b5-65d7-f5c0-808c7aba6cef", 
);

结果 - HTTP::Response=HASH(0x27884bc)

这是添加标题的正确方法吗?

【问题讨论】:

  • 您没有显示完整的代码。该代码不会产生该输出,因为没有发生发送。请参阅stackoverflow.com/documentation/perl/983/… 了解如何输出对象以便理解它们。
  • 请拨打tour 了解如何将问题标记为已解决。 :)

标签: perl curl lwp


【解决方案1】:

如果您想使用 LWP::UserAgent 使用自定义标头执行 GET 请求,您可以将它们放入 $ua->get() 调用中,以 the documentation describes 的方式。

此方法将在给定的 $url 上发送一个 GET 请求。可以提供更多参数来初始化请求的标头。这些以单独的名称/值对的形式给出。返回值是一个响应对象。有关它提供的接口的描述,请参见 HTTP::Response。

您的示例缺少您发送请求的部分,因此很难判断您在做什么。

您的 @headers 数组包含标头和 URL 参数。这不会如你所愿。如果您想像这样构造 URL 和标头,则需要一种不同的方法。

使用 URI module 以编程方式创建 URI,然后使用 LWP::UA 的 get 发送它,包括标头。

use strict;
use warnings;
use LWP::UserAgent;
use URI;

my $uri = URI->new('https://10.51.10.26/10/download');
$uri->query_form(
    "startTime"       => $queryStart, # these two need 
    "endTime"         => $queryEnd,   # to be set above
    "cNat"            => "True", 
    "cNatShowDst"     => "False", 
    "tuplesFile"      => "False", 
    "summarizeTuples" => "False",   
);

my $ua = LWP::UserAgent->new;
my $res = $ua->get(
    $uri,
    "Authorization" => "Basic YWRtaW46YWRtaW4",
    "Cache-Control" => "no-cache", 
    "Postman-Token" => "eb3955f1-a7b5-65d7-f5c0-808c7aba6cef", 
);

if ($res->is_success) {
    # do stuff with content
} else {
    # request failed
}

要输出完整的 HTTP::Response 对象,请使用 Data::Dumper

use Data::Dumper;
print Dumper $res;

【讨论】:

  • 感谢您全面快速的回复。我会试一试。
【解决方案2】:

您的 Perl 代码不会生成您显示的 HTTP::Response 对象。它不可能这样做,因为您的代码实际上并没有发出请求。

将新标头放入名为@headers 的数组中也不会产生任何有用的结果。您需要以某种方式将这些标头附加到请求中。

LWP 包括 a useful tutorial。在尝试使用这些工具做太多事情之前,最好先阅读一下。特别是,它包括一个标题为Adding Other HTTP Request Headers 的部分,内容如下:

请求最常用的语法是$response = $browser->get($url), 但实际上,您可以添加额外的 HTTP 标头行 通过在 URL 后添加键值对列表来添加请求,例如 所以:

$response = $browser->get( $url, $key1, $value1, $key2, $value2, ... );

例如,这里是发送更多类似 Netscape 标头的方法,在 如果您正在处理一个会拒绝您的网站 请求:

my @ns_headers = (
  'User-Agent' => 'Mozilla/4.76 [en] (Win98; U)', 
  'Accept' => 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,image/png, */*',
  'Accept-Charset' => 'iso-8859-1,*,utf-8', 
  'Accept-Language' => 'en-US', );

...

$response = $browser->get($url, @ns_headers);

如果您不重复使用该数组,则可以继续执行 这个:

$response = $browser->get($url,
  'User-Agent' => 'Mozilla/4.76 [en] (Win98; U)',
  'Accept' => 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*',
  'Accept-Charset' => 'iso-8859-1,*,utf-8',
  'Accept-Language' => 'en-US',
);

如果您只更改“用户代理”行,您可以 将 $browser 对象的默认行从“libwww-perl/5.65”(或 之类的)到任何你喜欢的,使用 LWP::UserAgent 代理方法:

$browser->agent('Mozilla/4.76 [en] (Win98; U)');

值得指出的是,LWP::UserAgent 也有一个 default_headers() 方法,它允许您定义添加到该用户代理发出的每个请求的标头。

人们为创建大量有用的 Perl 工具文档付出了很多努力。如果人们不阅读它,那么这种努力是相当浪费的。

【讨论】:

    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多