NAME

Quiq::SoapWsdlServiceCgi - Basisklasse für SOAP Web Services via CGI

BASE CLASSES

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:

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

  2. 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.171

AUTHOR

Frank Seitz, http://fseitz.de/

COPYRIGHT

Copyright (C) 2020 Frank Seitz

LICENSE

This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.