如何使用 LWP::UserAgent 接受 gzip 压缩内容?

发布于 2024-08-01 13:05:24 字数 158 浏览 9 评论 0原文

我正在使用 Perl 的 LWP::UserAgent 通过 Web 获取一些页面,并且希望尽可能礼貌。 默认情况下,LWP::UserAgent 不会通过 gzip 无缝处理压缩内容。 有没有一种简单的方法可以做到这一点,为每个人节省一些带宽?

I am fetching some pages over the Web using Perl's LWP::UserAgent and would like to be as polite as possible. By default, LWP::UserAgent does not seamlessly handle compressed content via gzip. Is there an easy way to make it do so, to save everyone some bandwidth?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不一样的天空 2024-08-08 13:05:24

LWP 内置了此功能,这要归功于 HTTP::Message。 但它有点隐藏。

首先确保您已安装 Compress::Zlib你可以处理gzipHTTP::Message::decodable () 将根据您已安装的模块输出允许的编码列表; 在标量上下文中,此输出采用逗号分隔的字符串形式,您可以将其与“Accept-Encoding”HTTP 标头一起使用,该标头 LWP 要求您添加到 HTTP::Request-s 自己。 (在我的系统上,安装了 Compress::Zlib ,列表为“gzipx-gzipdeflate”。)

当您的 HTTP::Response 返回,请务必使用 $response->decoded_content 访问内容 而不是 $response->content

LWP::UserAgent 中,所有这些都像this:

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 has this capability built in, thanks to HTTP::Message. But it's a bit hidden.

First make sure you have Compress::Zlib installed so you can handle gzip. HTTP::Message::decodable() will output a list of allowed encodings based on the modules you have installed; in scalar context, this output takes the form a comma-delineated string that you can use with the 'Accept-Encoding' HTTP header, which LWP requires you to add to your HTTP::Request-s yourself. (On my system, with Compress::Zlib installed, the list is "gzip, x-gzip, deflate".)

When your HTTP::Response comes back, be sure to access the content with $response->decoded_content instead of $response->content.

In LWP::UserAgent, it all comes together like this:

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;

This will also decode text to Perl's unicode strings. If you only want LWP to uncompress the response, and not mess with the text, do like so:

print $response->decoded_content(charset => 'none');
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文