我是一个新的perl程序员,试图将curl请求转换为Perl脚本,使用LWP:UserAgent。
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)
这是添加标题的正确方法吗?
答案 0 :(得分:4)
您的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', );
如果您只是更改“用户代理”行,您可以 从“libwww-perl / 5.65”更改
$browser
对象的默认行(或 喜欢你喜欢的任何东西,使用LWP :: UserAgent代理方法:$browser->agent('Mozilla/4.76 [en] (Win98; U)');
值得指出的是,LWP::UserAgent还有一个default_headers()
方法,允许您定义添加到该useragent发出的每个请求的标头。
人们花了很多精力为Perl工具创建了许多有用的文档。如果人们不读它,这种努力就会被浪费掉。
答案 1 :(得分:2)
如果您想使用LWP :: UserAgent的自定义标头执行GET请求,您可以the documentation describes的方式将它们放入$ua->get()
来电。
此方法将在给定的$ url上发送GET请求。可以给出进一步的参数来初始化请求的头部。这些是作为单独的名称/值对给出的。返回值是响应对象。有关它提供的接口的说明,请参阅HTTP :: Response。
您的示例缺少发送请求的部分,因此很难说出您在做什么。
您的@headers
数组包含标头和网址参数。这不会做你期望的事情。如果你想构建这样的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;