2016-07-27 38 views
0

我是一个新的perl程序员,试图将curl请求转换为使用LWP:UserAgent的Perl脚本。Perl LWP:UserAgent如何添加标题?

的卷曲请求的例子是:

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

您没有显示完整的代码。该代码不会生成该输出,因为没有发送发生。请参阅http://stackoverflow.com/documentation/perl/983/debug-output#t=201607270944292058065以了解如何输出对象,以便了解它们。 – simbabque

+1

请参考[导览]了解如何将问题标记为已解决。 :) – simbabque

回答

2

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

该方法将在给定的$ url上发送一个GET请求。可以给出更多的参数来初始化请求的头部。这些是作为单独的名称/值对给出的。返回值是一个响应对象。请参阅HTTP :: Response了解它提供的接口的描述。

您的示例缺少发送请求的部分,因此很难说出您正在做什么。您的@headers数组包含标头和URL参数。这不会做你期望的。如果你想构建这样的URL和标题,你需要一个不同的方法。

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

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

my $uri = '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_succss) { 
    # do stuff with content 
} else { 
    # request failed 
} 

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

use Data::Dumper; 
print Dumper $res; 
+0

感谢您的全面和快速的回​​应。我会给它一个旋转。 – Talgarth

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, ...); 

例如,这里是如何发送一些网景类似的报头,在你处理,否则将拒绝您的 请求网站 情况:

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->agent('Mozilla/4.76 [en] (Win98; U)'); 
: 的 $browser对象的默认线路从 “的libwww-perl的/ 5.65”(或 等),以任何你喜欢的,用LWP :: UserAgent的代理方法改变

值得指出的是,LWP::UserAgent也有一个default_headers()方法,它允许您定义头添加到该useragent所做的每个请求。

人们花费了大量精力为Perl工具创建大量有用的文档。如果人们没有阅读,那么这种努力就会被浪费掉。