LWP::UserAgent を使用して gzip 圧縮されたコンテンツを受け入れるにはどうすればよいですか?
-
18-09-2019 - |
質問
Perl を使用して Web 上でいくつかのページを取得しています LWP::UserAgent
そしてできるだけ丁寧に対応したいと思っています。デフォルトでは、 LWP::UserAgent
gzip を介して圧縮コンテンツをシームレスに処理しません。全員の帯域幅を節約するために、そうする簡単な方法はありますか?
解決
LWP にはこの機能が組み込まれています。 HTTP::Message
. 。でも、ちょっと隠れてるんです。
まず、持っていることを確認してください Compress::Zlib
あなたが扱えるようにインストールされています gzip
. HTTP::Message::decodable()
インストールしたモジュールに基づいて、許可されたエンコーディングのリストが出力されます。スカラー コンテキストでは、この出力は、' とともに使用できるカンマ区切りの文字列の形式になります。Accept-Encoding
' HTTP ヘッダー、 LWP
に追加する必要があります HTTP::Request
-あなた自身です。(私のシステムでは、 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');