Prty::SoapWsdlServiceCgi - Basisklasse für SOAP Web Services via CGI
Prty::Object
SOAP::Server::Parameters
Die Klasse stellt die Grundfunktionalität eines SOAP Web Service mit WSDL zur Verfügung. Ein konkreter Service wird realisiert, indem eine Klasse mit der Implementierung konkreter Service-Methoden von dieser Basisklasse abgeleitet wird.
Der Web Service wird angesprochen (SOAP-Call oder Abruf der WSDL-Spezifikation), wenn die Klassenmethode $class->run() über die abgeleitete Klasse aus einem CGI-Programm heraus aufgerufen wird.
Vorgehen bei der Realisierung eines konkreten Web Service:
Abgeleitete Klasse mit den Methoden des Web Service implementieren
package MyWebServiceClass; use base qw/Prty::SoapWsdlServiceCgi/; =begin WSDL <Pod::WSDL-Spezifikation für Methode myWebServiceMethod1()> =end WSDL =cut sub myWebServiceMethod1 { my ($class,<Parameter der Methode>,$som) = @_; <Implementierung der Methode> return <Return Wert>; } <weitere Methoden> # eof
Die Signatur der Methoden (Parameter und Returnwerte) muss in einem POD-Abschnitt (=begin WSDL ... =end WSDL) gemäß den Konventionen von Pod::WSDL vorgenommen werden (Beschreibung siehe dort).
=begin WSDL ... =end WSDL
Die Klasse Prty::SoapWsdlServiceCgi ist von SOAP::Server::Parameters abgeleitet. Daher wird der Parameterliste der Methoden der deserialisierte Client-Request in Form eines SOAP::SOM-Objekts hinzugefügt. In den Methoden kann also auf sämtliche Request-Information zugegriffen werden, z.B. Header-Information, die für eine Authentisierung benötigt wird.
CGI-Programm my-webservice implementieren, das den Web Service ausführt:
#!/usr/bin/env perl use MyWebServiceClass; MyWebServiceClass->run; # eof
Der Webservice kann unter einem beliebigen URI installiert werden. Wird der URI vom Client mit angehägtem "?wsdl" aufgerufen, liefert der Web Service seine WSDL-Spezifikation. Alle anderen Aufrufe behandelt der Service als SOAP-Request.
Der Web Service (my-webservice, MyWebServiceClass.pm) kann ohne Änderung auch unter mod_perl ausgeführt werden. Dadurch wird der serverseitige Overhead je Methodenaufruf deutlich reduziert. Bei einem Test über das Internet
Client <--Internet--> Server
ergab sich eine Beschleunigung um Faktor 3 (0.06s statt 0.2s Sekunden für einen Methodenaufruf ohne Parameter, ohne Code und ohne Returnwert).
Getestetes Setup (Apache2, ModPerl2) auf Ebene eines VirtualHost:
<VirtualHost ...> ... PerlResponseHandler ModPerl::Registry PerlOptions +ParseHeaders +Parent PerlSwitches -ILIBRARY_PATH RewriteEngine on RewriteRule ^/URI$ PROGRAM_PATH/my-webservice [H=perl-script] </VirtualHost>
Hierbei ist:
Pfad des Verzeichnisses mit der WebService-Klasse (MyWebServiceClass).
URI des Web Service.
Pfad des Verzeichnisses mit dem WebService-Programm (my-webservice).
Sollte der Service nicht ansprechbar sein, kann dem im Apache error.log auf den Grund gegangen werden.
Die WSDL-Generierung durch die WebService-Klasse kann an der Kommandozeile getestet werden:
$ SCRIPT_URI=http://x QUERY_STRING=wsdl perl -MMyWebServiceClass -e 'MyWebServiceClass->run'
Der gleiche Test über das CGI-Programm, das die WebService-Klasse ruft:
$ SCRIPT_URI=http://x QUERY_STRING=wsdl perl ./mywebservice.cgi
$class->run;
Führe einen Aufruf über Klasse $class aus und liefere die Antwort an den Client. Der Aufruf ist entweder eine Abfrage der WSDL-Spezifikation des Service (URI?wsdl) oder ein SOAP-Aufruf.
Die Methode liefert keinen Wert zurück.
Frank Seitz, http://fseitz.de/
To install Prty, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Prty
CPAN shell
perl -MCPAN -e shell install Prty
For more information on module installation, please visit the detailed CPAN module installation guide.