Ich erhalte einige Seiten über das Web mit Perls LWP::UserAgent
und möchte so höflich wie möglich sein. Standardmäßig verarbeitet LWP::UserAgent
komprimierten Inhalt nicht nahtlos über gzip. Gibt es eine einfache Möglichkeit, dies zu tun, um allen eine gewisse Bandbreite zu sparen?Wie kann ich gzip-komprimierten Inhalt mit LWP :: UserAgent akzeptieren?
Antwort
LWP hat diese Fähigkeit eingebaut, dank HTTP::Message
. Aber es ist ein bisschen versteckt.
Zuerst sicherstellen, dass Sie Compress::Zlib
installiert haben, damit Sie gzip
behandeln können. HTTP::Message::decodable()
gibt eine Liste der erlaubten Kodierungen basierend auf den Modulen aus, die Sie installiert haben; Im skalaren Kontext nimmt diese Ausgabe die Form einer durch Kommas definierten Zeichenfolge an, die Sie mit dem HTTP-Header 'Accept-Encoding
' verwenden können, den Sie LWP
hinzufügen müssen, um Ihre HTTP::Request
-s selbst hinzuzufügen. (Auf meinem System mit Compress::Zlib
installiert, die Liste ist "gzip
, x-gzip
, deflate
".)
Wenn Ihr HTTP::Response
zurückkommt, müssen Sie den Inhalt mit $response->decoded_content
statt $response->content
zuzugreifen.
In LWP::UserAgent
, es kommt alles zusammen wie folgt aus:
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 das Perl Unicode-Strings dekodieren. Wenn Sie nurLWP
wollen die Antwort auf dekomprimieren, und nicht Chaos mit dem Text, zu tun wie so:
print $response->decoded_content(charset => 'none');
Hinweis: Dies funktioniert mit LWP 5,814 (Juli 08) oder neuer. –
Von meinem Test mit LWP 6.03 war alles, was benötigt wurde, "decoded_content" anstatt "content" zu verwenden. – Cas