2010-03-18 6 views

Antwort

8

Wie in perldoc LWP::UserAgent erwähnt, ist die Standard-Umleitungen für GET und HEAD Anfragen folgen:

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

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

Hier ist ein Beispiel:

#!/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"; 
} 

Ausgang:

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

Absolut korrekt, aber ich denke, die OP wollte wissen, was die URLs wirklich waren, sobald alle Weiterleitungen verfolgt worden waren. –

+0

@Tony Danke für den Kopf. Ich habe es nicht sofort bemerkt und ein Beispielskript geschrieben, nachdem deine Antwort angenommen wurde. –

+0

Oooh, ich habe die uri-> as_string-Methode nicht gesehen, die die gesamte Sequenz anzeigt. Sehr schön. –

11

Wenn Sie verwenden die voll funktionsfähige Version von LWP::UserAgent, dann ist die zurückgegebene Antwort eine Instanz von HTTP::Response, die wiederum als Attribut eine HTTP::Request hat. Beachten Sie, dass dies NOT ist notwendigerweise die gleiche HTTP :: -Anforderung, die Sie mit der ursprünglichen URL in Ihrer Gruppe von URLs erstellt haben, wie in der HTTP :: Response-Dokumentation für die Methode zum Abrufen der Anforderungsinstanz innerhalb der Antwortinstanz beschrieben:

$ r-> Anfrage ($ request)

Dies wird verwendet, um die Anfrage Attribut zu erhalten/set. Das Anforderungsattribut ist eine Referenz auf die Anforderung, die diese Antwort verursacht hat. Es muss nicht dieselbe Anfrage sein, die an die $ ua> request() -Methode übergeben wird, da es möglicherweise Umleitungen und Autorisierungsversuche dazwischen gegeben hat.

Sobald Sie das Anfrageobjekt haben, können Sie die URI-Methode verwenden, um den URI abzurufen. Wenn Umleitungen verwendet wurden, ist der URI das Ergebnis der Verfolgung der Umleitungskette.

Hier ist ein Perl-Skript, getestet und überprüft, dass Sie das Skelett, was, die Sie brauchen:

#!/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

Danke für die gründliche Erklärung. – planetp