2010-03-18 33 views

回答

8

正如perldoc LWP::UserAgent規定,默認爲遵循重定向爲GETHEAD請求:

$ua = LWP::UserAgent->new(%options) 

... 
     KEY      DEFAULT 
     -----------    -------------------- 
     max_redirect   7 
     ... 
     requests_redirectable ['GET', 'HEAD'] 

下面是一個例子:

#!/usr/bin/perl 

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

my $ua = LWP::UserAgent->new(); 
$ua->show_progress(1); 

my $response = $ua->head('http://unur.com/'); 

if ($response->is_success) { 
    print $response->request->uri->as_string, "\n"; 
} 

輸出:

** HEAD http://unur.com/ ==> 301 Moved Permanently (1s) 
** HEAD http://www.unur.com/ ==> 200 OK 
http://www.unur.com/
+0

絕對正確,但我認爲OP想要知道一旦所有重定向被遵循,URL實際上是什麼。 – 2010-03-18 15:03:24

+0

@Tony謝謝你的領導。我沒有立即注意到,並且在接受答案後顯然發佈了一個示例腳本。 – 2010-03-18 15:28:00

+0

Oooh,我沒有看到顯示整個序列的uri-> as_string方法。非常好。 – 2010-03-18 15:59:10

11

如果您可以使用的全功能版本,那麼返回的響應是HTTP::Response的實例,其又具有作爲屬性HTTP::Request。請注意,這是而不是必須與您在URL集中使用原始網址創建的HTTP :: Request相同,如響應實例中用於檢索請求實例的方法的HTTP :: Response文檔中所述:

$ R->請求($請求)

這用於獲取/設置的請求屬性。請求屬性是對引起此響應的請求的引用。它不必是傳遞給$ ua-> request()方法的相同請求,因爲可能有重定向和授權重試。

一旦你有請求對象,你可以使用uri方法來獲取URI。如果使用重定向,則URI是遵循重定向鏈的結果。

這裏有一個Perl腳本,測試和驗證,這給你的你所需要的骨架:

#!/usr/bin/perl 

use strict; 
use warnings; 

use LWP::UserAgent; 

my $ua; # Instance of LWP::UserAgent 
my $req; # Instance of (original) request 
my $res; # Instance of HTTP::Response returned via request method 

$ua = LWP::UserAgent->new; 
$ua->agent("$0/0.1 " . $ua->agent); 

$req = HTTP::Request->new(HEAD => 'http://www.ecu.edu/wllc'); 
$req->header('Accept' => 'text/html'); 

$res = $ua->request($req); 

if ($res->is_success) { 
    # Using double method invocation, prob. want to do testing of 
    # whether res is defined. 
    # This is inline version of 
    # my $finalrequest = $res->request(); 
    # print "Final URL = " . $finalrequest->url() . "\n"; 
    print "Final URI = " . $res->request()->uri() . "\n"; 
} else { 
    print "Error: " . $res->status_line . "\n"; 
} 
+0

感謝您的詳細解釋。 – planetp 2010-03-18 15:09:43

相關問題