2011-05-02 38 views
0

要得到某个网站的响应,我必须给出一个确切的请求字符串,HTTP/1.1。我用telnet试了一下,它给了我想要的回复(重定向,但我需要它)。发送一个简单的字符串请求与LWP

但是,当我试图给相同的请求字符串HTTP::Request->parse(),我只是得到消息400 URL must be absolute

我不确定是否这是网站或LWP给了我,因为正如我所说,响应与telnet合作。

这是代码:

my $req = "GET/HTTP/1.1\n". 
    "Host: www.example-site.de\n". 
    "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1\n". 
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n". 
    "Accept-Language: en-us,en;q=0.5\n". 
    "Accept-Encoding: gzip, deflate\n". 
    "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\n". 
    "Keep-Alive: 115\n". 
    "Connection: keep-alive\n"; 

# Gives correct request string 
print HTTP::Request->parse($req)->as_string; 

my $ua = LWP::UserAgent->new(cookie_jar => {}, agent => ''); 
my $response = $ua->request(HTTP::Request->parse($req)); 

# 400 error 
print $response->as_string,"\n"; 

任何人都可以帮助我在这里?

回答

0

好吧,我使用套接字的确如此。毕竟,我有HTTP请求,并希望得到明确的回应。这里的代码的人谁是感兴趣:

use IO::Sockets; 

my $sock = IO::Socket::INET->new(
    PeerAddr => 'www.example-site.de', 
    PeerPort => 80, 
    Proto => 'Tcp', 
); 
die "Could not create socket: $!\n" unless $sock; 

print $sock, $req; 

while(<$sock>) { 
    # Look for stuff I need 
} 

close $sock; 

重要的是要记住离开while,作为HTTP响应不会有EOF结束只是重要的。

0

它在我看来像解析请求不是100%往返安全,这意味着你不能将响应反馈回请求。

看起来像一见钟情,但模块已经很长时间了......另一方面,我甚至不知道你可以使用这个模块来解析请求,所以也许它不是很好测试。

下面的测试案例应该指出您的问题,即该URL没有正确组装以供应给$req->request方法。

use strict; 
use warnings; 
use LWP::UserAgent; 
use HTTP::Request; 
use Test::More; 

my $host = 'www.example.com'; 
my $url = '/bla.html'; 

my $req = <<"EOS"; 
GET $url HTTP/1.1 
Host: $host 
EOS 

# (1) parse the request 
my $reqo = HTTP::Request->parse($req); 
isa_ok $reqo, 'HTTP::Request'; 
diag explain $reqo; 
diag $reqo->as_string; 

# (2) construct the request 
my $reqo2 = HTTP::Request->new(GET => "http://$host$url"); 
isa_ok $reqo2, 'HTTP::Request'; 
diag explain $reqo2; 
diag $reqo2->as_string; 

is $reqo->uri, $reqo2->uri, 'both URLs are identical'; 

my $ua = LWP::UserAgent->new(cookie_jar => {}, agent => ''); 
for ($reqo, $reqo2) { 
    my $response = $ua->request($_); 
    diag $response->as_string,"\n"; 
} 

done_testing; 
1

LWP::UserAgent如果在请求中没有指定模式,则会因您遇到的错误而死亡。它可能需要它来正确地使用它。

因此,要使其工作,你需要指定完整的URL为您的要求:

my $req_str = "GET http://www.example.de/\n". 
    "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1\n". 
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n". 
    "Accept-Language: en-us,en;q=0.5\n". 
    "Accept-Encoding: gzip, deflate\n". 
    "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\n". 
    "Keep-Alive: 115\n". 
    "Connection: keep-alive\n"; 
+0

但我不能,因为服务器不会接受我的请求。它只接受我上面给出的形状的请求。 – Lanbo 2011-05-02 14:59:24

+0

@Scán - 如果服务器不灵活,可能唯一的方法就是直接通过套接字或者[Net :: Telnet](http://search.cpan.org/perldoc?Net :: Telnet) – bvr 2011-05-02 16:26:53

+0

@Scán:你怎么知道服务器不接受请求?它应该,如果'parse()'不是越野车。 – reinierpost 2011-05-03 08:49:07

相关问题