Wie kann ich gzip-komprimierte Inhalte mit LWP :: Useragent akzeptieren?
-
18-09-2019 - |
Frage
Ich hole einige Seiten über das Web Perl LWP::UserAgent
verwenden und so höflich wie möglich sein möchte. Standardmäßig handhaben ist LWP::UserAgent
nicht nahtlos komprimierte Inhalte über gzip. Gibt es eine einfache Möglichkeit, es zu tun, so zu machen, zu speichern jedes einig Bandbreite?
Lösung
LWP hat diese eingebaute Fähigkeit in dank HTTP::Message
. Aber es ist etwas versteckt.
Zuerst stellen Sie sicher, Sie haben Compress::Zlib
installiert, so dass Sie gzip
verarbeiten kann. HTTP::Message::decodable()
ausgibt, eine Liste von erlaubt Codierungen auf Basis der Module, die Sie installiert haben; in Skalarkontext, nimmt diese Ausgabe die Form eine durch Kommata abgegrenzte Zeichenfolge, die Sie mit dem 'Accept-Encoding
' HTTP-Header, der a href <= "http://search.cpan.org/perldoc/LWP" rel = "noreferrer verwenden können „> LWP
erfordert, dass Sie Ihr HTTP::Request
es selbst. (Auf meinem System mit Compress::Zlib
installiert ist, ist die Liste „gzip
, x-gzip
, deflate
“.)
Wenn Sie Ihre HTTP::Response
zurück kommt, müssen Sie den Inhalt mit $response->decoded_content
zuzugreifen statt von $response->content
.
LWP::UserAgent
, es kommt alles zusammen wie folgt:
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;
Dies wird auch Text in der Perl Unicode-Strings dekodieren. Wenn Sie nur wollen LWP
die Antwort zu dekomprimieren, und nicht mit Zohan an der Text, tun wie folgt:
print $response->decoded_content(charset => 'none');