【发布时间】:2010-11-20 02:17:43
【问题描述】:
我正在使用 Perl 的 LWP::UserAgent 在 Web 上获取一些页面,并且希望尽可能有礼貌。默认情况下,LWP::UserAgent 不会通过 gzip 无缝处理压缩内容。有没有一种简单的方法可以做到这一点,为每个人节省一些带宽?
【问题讨论】:
标签: perl lwp content-encoding
我正在使用 Perl 的 LWP::UserAgent 在 Web 上获取一些页面,并且希望尽可能有礼貌。默认情况下,LWP::UserAgent 不会通过 gzip 无缝处理压缩内容。有没有一种简单的方法可以做到这一点,为每个人节省一些带宽?
【问题讨论】:
标签: perl lwp content-encoding
感谢HTTP::Message,LWP 已内置此功能。但是有点隐蔽。
首先确保您已安装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://*.com/feeds',
'Accept-Encoding' => $can_accept,
);
print $response->decoded_content;
这也会将文本解码为 Perl 的 unicode 字符串。如果您只希望 LWP 解压缩响应,而不是弄乱文本,请这样做:
print $response->decoded_content(charset => 'none');
【讨论】:
decoded_content 而不是 content。