【问题标题】:How can I accept gzip-compressed content using LWP::UserAgent?如何使用 LWP::UserAgent 接受 gzip 压缩的内容?
【发布时间】:2010-11-20 02:17:43
【问题描述】:

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

【问题讨论】:

    标签: perl lwp content-encoding


    【解决方案1】:

    感谢HTTP::Message,LWP 已内置此功能。但是有点隐蔽。

    首先确保您已安装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 中,所有内容都像这样组合在一起:

    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');
    

    【讨论】:

    • 根据我对 LWP 6.03 的测试,所有需要的是使用 decoded_content 而不是 content
    最近更新 更多