Mein Perl Modul HTTPRequest.pm, Investigation HTTP/HTTPs Request

Der zweckmäßige Ersatz für die bisherige LWP-Library

Vielfältige Methoden für den Request

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).

Konstruktor: my $ro = HTTPRequest->new()

# 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()

$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.

$ro->request_header()

Monitoring, gibt den Original im Request gesendeten Header zur Kontrolle aus.

Methoden für die Ausgabe der Response

Wie für den Request gibt es vielfältige Möglichkeiten zum Auswerten der Response. Siehe untenstehend:

$ro->response_header()

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

$ro->response_body()

Unter der Voraussetzung, es wurde ein einzelner Request abgesetzt, liefert diese Methode den Message-Body der Response als String.

$ro->response_cookies()

Liefert eine Hash-Referenz, empfangene Cookies als { Cookiename => CookieWert }.

$ro->print_rawdata()

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.

$ro->print_rawbody()

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.

$ro->response_slice()

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'
          }
        ];

$ro->response_headslice()

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.

Common Request und toString()

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.

Anwendungsbeispiel: RSS-Feed in eigene Website einbauen

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 ]} ;

Download HTTPRequest.pm, HTTPsRequest.pm

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. s​os­@rolf­rost.de und wenn Sie möchten daß mein Prepaid nicht verfällt dürfen Sie mich auch gerne anrufen 01625 26 40 76.