NAME
Quiq::SoapWsdlServiceCgi - Basisklasse für SOAP Web Services via CGI
BASE CLASSES
SOAP::Server::Parameters
DESCRIPTION
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.
Web Service implementieren
Vorgehen bei der Realisierung eines konkreten Web Service:
Abgeleitete Klasse mit den Methoden des Web Service implementieren
package MyWebServiceClass; use base qw/Quiq::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).Die Klasse Quiq::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.
Web Service unter mod_perl ausführen
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:
- LIBRARY_PATH
-
Pfad des Verzeichnisses mit der WebService-Klasse (MyWebServiceClass).
- URI
-
URI des Web Service.
- PROGRAM_PATH
-
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.
An der Kommandozeile testen
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
METHODS
Klassenmethoden
run() - Führe Aufruf aus
Synopsis
$class->run;
Description
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.
VERSION
1.206
AUTHOR
Frank Seitz, http://fseitz.de/
COPYRIGHT
Copyright (C) 2022 Frank Seitz
LICENSE
This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.