我使用Perl的LWP::UserAgent
通过Web获取一些页面,并希望尽可能礼貌。默认情况下,LWP::UserAgent
不能通过gzip无缝处理压缩内容。是否有一种简单的方法可以实现,为每个人节省一些带宽?如何使用LWP :: UserAgent接受gzip压缩内容?
20
A
回答
34
LWP内置此功能,感谢HTTP::Message
。但它有点隐藏。
首先确保您已安装Compress::Zlib
,以便您可以处理gzip
。 HTTP::Message::decodable()
将根据您安装的模块输出允许的编码列表;在标量上下文中,此输出采用逗号分隔的字符串形式,您可以与'Accept-Encoding
'HTTP标头一起使用,其中LWP
要求您自行将其添加到HTTP::Request
-s。 (在我的系统,安装Compress::Zlib
,名单是“gzip
,x-gzip
,deflate
”。)
当你的HTTP::Response
回来,一定要与$response->decoded_content
而不是$response->content
访问内容。
在LWP::UserAgent
,这一切都在一起,像这样:
my $ua = LWP::UserAgent->new;
my $can_accept = HTTP::Message::decodable;
my $response = $ua->get('http://stackoverflow.com/feeds',
'Accept-Encoding' => $can_accept,
);
print $response->decoded_content;
这也将解码文本Perl的Unicode字符串。如果你只想到LWP
解压缩的反应,而不是与文字混乱,不喜欢这样:
print $response->decoded_content(charset => 'none');
注:这适用于LWP 5.814(自08年7月)或更高版本。 – 2009-10-18 21:07:03
从我使用LWP 6.03进行测试时,所有需要的只是使用'decoded_content'而不是'content'。 – Cas 2013-04-02 18:05:51