Der zweckmäßige Ersatz für die bisherige LWP-Library
Die Module, bzw, mit diesen Klassen (HTTPRequest, HTTPsRequest
) erstellte Instanzen bieten eine Vielzahl an Methoden, mit denen Sie beliebige HTTP/HTTPs-Requests feuern können. Sie können damit insbesondere die Konfiguration Ihrer Webserver/Frameworks umfangreich prüfen und solche Prüfungen auch automatisieren.
Beide Module eignen sich hervorragend zur Entwicklung von Webservices wie REST, SOAP
und Remote Procedure Call (XMLRPC)
.
# Erstelle Request-Objekt my $ro = HTTPRequest->new( # HTTPsRequest->new host => 'example.com', port => 80, # Default 80 bzw.443 http => '1.1', # Default 1.0 timeout => 3, # Default 10 ) or die $@;
Das Beispiel obenstehend zeigt die möglichen Argumente für den Konstruktor, u.a. kann die HTTP-Version angegeben werden. Sofern die Requests über einen Proxy
-Server erfolgen sollen, wird dieser als Host
eingetragen. Der uri
in der request
-Methode ist dann voll qualifiziert (z.B. http://example.com/index.html
) zu notieren, ansonsten reicht die Pfadangabe (z.B. /index.html
).
Sofern die Verbindung nicht zustandekommt, ist der Grund dafür in $@
zu finden. Unter Nutzung der Default-Einstellungen, genügt es in den meisten Fällen, nur den host
zu notieren.
$ro->request( method => 'POST', uri => '/', content => 'name=foo;vname=bar' Connection => 'Close', 'Accept-Encoding' => 'gzip' );
Die Argumente method, uri, content
(optional) sind keine, alle Weiteren sind Request-Header
. Die request
-Methode gibt Ihnen jede erdenkliche Möglichkeit in die Hand, einen HTTP-Request
abzusetzen.
Monitoring, gibt den Original im Request gesendeten Header zur Kontrolle aus.
Wie für den Request gibt es vielfältige Möglichkeiten zum Auswerten der Response. Siehe untenstehend:
Vorausgesetzt, dass nur ein Request gesendet wurde gibt die Methode alle Response-Header als Hash-Referenz zurück, z.B.:
my $ro = HTTPRequest->new( host => 'rolfrost.de', http => '1.0' ) or die $@; $ro->request( method => 'GET', uri => '/' ); print Dumper $ro->response_header; $VAR1 = { 'Server' => 'Apache', 'statuscode' => '200', 'statusmesg' => 'OK', 'Date' => 'Fri, 23 Oct 2001 08:27:13 GMT', 'Connection' => 'close', 'Vary' => 'Accept-Encoding', 'Content-Language' => 'de', 'x-class' => 'HTMLfile', 'Cache-Control' => 'no-cache, must-revalidate, proxy-revalidate, no-x-cache', 'Content-Type' => 'text/html; charset=UTF-8', 'Set-Cookie' => 'FRAMEWORK=834839f03c12b63ea0bd0697e16aa85b', 'Expires' => 'Thu, 28 Nov 2001 01:01:01 GMT' };
Unter der Voraussetzung, es wurde ein einzelner Request abgesetzt, liefert diese Methode den Message-Body
der Response als String
.
Liefert eine Hash-Referenz
, empfangene Cookies als { Cookiename => CookieWert }
.
Gibt die Bytessequenz
(Rohdaten) einer Response aus auf STDOUT
. Optional können Sie ein Handle
übergeben, so sind die Daten danach im übergebenen Handle
zu finden. Im Handle
bzw. STDOUT
sind sämtliche Response-Header plus Message-Bodies enthalten.
Gibt die Bytessequenz
(Rohdaten) des Message-Body
einer Response aus auf STDOUT
. Optional können Sie ein Handle
übergeben, so sind die Daten danach im übergebenen Handle
zu finden. Vorausgesetzt, es wurde nur ein Request abgesetzt.
Diese Methode liefert ein Array
mit Hash-Referenzen
und ist besonders dazu geeignet, die Response auf mehrere Requests in einer persistenten Connection(: Keep-Alive)
auszuwerten bzw. zu verarbeiten. Jede Hash-Referenz
beinhaltet die vollständigen Header einer einzelnen Response und zusätzlich die Schlüssel statuscode, statusmessage, body
zusammen mit den entsprechenden Werten. Beispiel Slice mit einer Response:
$VAR1 = [ { 'Server' => 'GSE', 'X-Frame-Options' => 'SAMEORIGIN', 'Accept-Ranges' => 'none', 'statuscode' => '200', 'statusmesg' => 'OK', 'Connection' => 'close', 'body' => '{ "location": { "lat": 50.0168907, "lng": 8.421125 }, "accuracy": 636.0 } ', 'X-XSS-Protection' => '1; mode=block', 'Cache-Control' => 'no-cache, no-store, max-age=0, must-revalidate', 'Content-Type' => 'application/json; charset=UTF-8', 'Pragma' => 'no-cache', 'Expires' => 'Fri, 01 Jan 1990 00:00:00 GMT', 'X-Content-Type-Options' => 'nosniff', 'Date' => 'Sun, 25 Oct 2001 08:17:21 GMT', 'Alternate-Protocol' => '443:quic,p=1', 'Vary' => 'Origin,Accept-Encoding', 'Alt-Svc' => 'quic=":443"; p="1"; ma=604800' } ];
Wie response_slice()
mit dem Unterschied, dass der Aufruf dieser Methode nur dann ein sinnvolles Ergebnis liefert, wenn alle Requests mit Request-Method HEAD
erfolgten. Das Ergebnis sieht aus wie obenstehend, nur mit dem Unterschied, dass der body
fehlt.
Die Klassenmethode common()
mit eingebautem Konstruktor gibt eine Instanz zurück und erlaubt infolge overload()
eine besonders einfache Verwendung:
print HTTPRequest->common( host => 'example.org', uri => '/', method => 'GET', );
Selbstverständlich können auch hier beliebige Request-Header und auch ein Message-Body übergeben werden.
Mit dem hier beschrieben Modul und meinem Perl-Framework sind das nur ein paar Zeilen:
my $R = HTTPsRequest->new( host => 'example.org', http => 1.1 ) or die $@; $R->request( method => 'GET', uri => '/xml.rss', Connection => 'Close' ); my $xml = $R->response_body; # Array mit Platzhaltern für das Template my @stash = map{{ /<(\w+)>(.*?)</sg }} @{[ $xml =~ /<item>(.*?)<\/item>/sg ]} ;
Alternative:
package myLWP;
# wrapper für HTTP::Request, LWP::UserAgent usw.
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request;
sub new{
my $class = shift;
my %param = (
uri => '',
method => 'GET',
enctype => 'application/x-www-form-urlencoded',
body => '',
headers => {},
@_);
%{$param{headers}} = (%{$param{headers}}, ("Content-Type" => $param{enctype}));
return eval{
my $self = bless{
ua => LWP::UserAgent->new(),
req => HTTP::Request->new(
$param{method} => $param{uri},
)
}, $class;
$self->{req}->header( %{$param{headers}} );
$self->{req}->content($param{body});
$self;
}
}
# Quick Request, liefert die komplette Response
sub quickreq{
my $class = shift;
my $self = $class->new(@_);
return $self->request->response;
}
# Methoden für Request-Objekt
# ua
sub request{
my $self = shift;
$self->{res} = $self->{ua}->request($self->{req});
return $self;
}
# Methoden für Response-Objekt
sub response_status{
my $self = shift;
my ($code, $lit) = split /\s+/, $self->{res}->status_line;
return $code;
}
# Gesamte Response mit Header
sub response{
my $self = shift;
return $self->{res}->as_string;
}
sub response_body{
my $self = shift;
return $self->{res}->content;
}
# Alle header der Response
sub response_header{
my $self = shift;
my $name = shift;
if( $name ){
return $self->{res}->header($name);
}
else{
my ($hs, $body) = split(/\n\n/, $self->{res}->as_string, 2);
return $hs;
}
}
1;#########################################################################
Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. sos@rolfrost.de und wenn Sie möchten daß mein Prepaid nicht verfällt dürfen Sie mich auch gerne anrufen 01625 26 40 76.