2011-07-30 119 views
2

如果我這樣做LWP ::用戶代理 - HTTP請求::

#!/usr/local/bin/perl 
use warnings; 
use 5.014; 
use LWP::UserAgent; 

my $ua = LWP::UserAgent->new(); 
my $res = $ua->get('http://www.perl.org'); 

我可以叫HTTP::Response方法,這樣

say $res->code; 

是它在某種程度上可以調用從$res對象HTTP::Request方法或需要明確創建HTTP::Request對象嗎?


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

my $method; 

my $res = $ua->get('http://www.perl.org'); 

$ua->add_handler(request_prepare => sub { my($request, $ua, $h) = @_; $method = $request->method; }, ); 

say $method; # Use of uninitialized value $method in say 

回答

2

HTTP::RequestLWP::UserAgent內部使用,如果他們將通過getpost - 方法返回它會已經太晚了,因爲該請求已經完成。但他們顯然已經預見到需要訪問請求對象,使他們實現回調,所以你可以在發送之前修改請求:

$ua->add_handler(request_prepare => sub { 
    my($request, $ua, $h) = @_; 

    # $request is a HTPP::Request 
    $request->header("X-Reason" => "just checkin"); 
}); 

所以,如果你需要訪問請求對象,而無需創建它,設置它 - 回調是要走的路。

+0

爲什麼我添加的例子並不像我想象的工作(打印請求方法)? –

+1

你必須在任何'get'或'post'方法之前調用'add_handler'。在你的例子中,處理程序在'get'之後添加,因此不被調用。 – vstm

1

其中HTTP::Request方法是否要調用?並在哪個請求對象?最後一個請求是由$ua

據我所知,LWP::get不保存最後創建/發送到任何地方的請求。

+0

它被保存在響應對象中。看到我的答案。 – ikegami

5

要獲得爲您創建的請求對象:

my $response = $ua->get('http://www.example.com/'); 
my $request = ($response->redirects, $response)[0]->request; 

可能更容易只是爲了創造一個請求對象自己

use HTTP::Request::Common qw(GET); 
my $request = GET('http://www.example.com/'); 
my $response = $ua->request($request);