Perl LWP:UserAgent如何添加标题?

Tal*_*rth 2 perl curl lwp

我是一个新的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"
Run Code Online (Sandbox Code Playgroud)

和我的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", 
);
Run Code Online (Sandbox Code Playgroud)

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

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

sim*_*que 6

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

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

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

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

使用URI 模块以编程方式创建 URI,然后使用 LWP::UAget发送它,包括标头。

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
}
Run Code Online (Sandbox Code Playgroud)

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

use Data::Dumper;
print Dumper $res;
Run Code Online (Sandbox Code Playgroud)


Dav*_*oss 5

您的Perl代码不会导致显示的HTTP :: Response对象。它不可能做到这一点,因为您的代码实际上并未发出请求。

将新的标头放在称为的数组中@headers也不会实现任何有用的作用。您需要以某种方式将这些标头附加到请求。

LWP包括一个有用的教程。在尝试对工具进行过多处理之前,最好先阅读一下。特别是,它包括一个标题为“ 添加其他HTTP请求标头”的部分,内容为:

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

$response = $browser->get( $url, $key1, $value1, $key2, $value2, ... );
Run Code Online (Sandbox Code Playgroud)

例如,如果您要处理的网站可能会拒绝您的请求,则以下是发送更多类似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);
Run Code Online (Sandbox Code Playgroud)

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

$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',
);
Run Code Online (Sandbox Code Playgroud)

如果只更改了“ User-Agent”行,则可以$browser使用LWP :: UserAgent代理方法将对象的默认行从“ libwww-perl / 5.65”(或类似名称)更改为所需的任意值:

$browser->agent('Mozilla/4.76 [en] (Win98; U)');
Run Code Online (Sandbox Code Playgroud)

值得指出的是,LWP :: UserAgent也有一种default_headers()方法,允许您定义标头,这些标头添加到该useragent发出的每个请求中。

人们已经为创建许多有用的Perl工具文档付出了很多努力。如果人们不读,那会浪费很多精力。