2016-07-27 37 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工具創建大量有用的文檔。如果人們沒有閱讀,那麼這種努力就會被浪費掉。