gSOAP: C/C++ Web Services and Clients
gSOAP: User Guide


Inhaltsverzeichnis



Voraussetzung zur Erstellung des gSOAP Webservices

  • Linux Betriebssystem
  • C(++) Compiler
  • gSOAP 2.7.0 [download]
  • Apache Axis 1.3 [download]
  • Java jdk 1.5


  • Erstellung des gSOAP Webservices

    Nachfolgend wird beschrieben wie ein eigenständiger Webservice in C(++) mit Hilfe der gSoap Bibliothek implementiert werden kann. Der gSOAP Compiler ermöglicht eine Realisierung von SOAP-Webservices und Clientanwendungen ohne detaillierte Kenntnisse des SOAP-Protokolls Version 1.1.


    1) Erstellen der Headerdatei
    Die Headerdatei <gSoapTextService.h> kann von Hand oder mit Hilfe eines Werkzeugs, wie beispielsweise wsdl2h erzeugt werden.

    Es ist notwendig in dieser Datei die entfernten Methoden mit ihren Parametern zu deklarieren.
    Folgende Einträge sollten enthalten sein:

      	//gsoap ns service name:	TextService
    	//gsoap ns service style:	document
    	//gsoap ns service encoding:	literal
    	//gsoap ns service namespace:	http://smartweb.semanticweb.org/TextService.wsdl
    	//gsoap ns service location:	http://localhost:1444
    	
    	//gsoap ns schema namespace: urn:TextService
    	int ns__processData(char **requestData, char **responseData);
       

    2) Erzeugen der Stub- und Skeleton-Klassen
    Der gSOAP Stub- und Skeleton Compiler soapcpp2 erzeugt für jede Methode automatisch die Skeleton-Routinen in C++ Quellcode. So ist es möglich diese Methoden später durch entfernte Aufrufe anzufragen. Ausserdem werden Serialisierer und Deserialisierer für die als Parameter festgelegten Datentypen erzeugt.

    Befehl: soapcpp2 -I/<gsoap-path> gSoapTextService.h

    Mit dem gSOAP-Compileraufruf werden folgende Dateien erzeugt:

                TextService.wsdl, 
    	    soapH.h, 
    	    soapTextServiceObject.h, 
    	    soapTextServiceProxy.h, 
    	    soapStub.h,
    	    TextService.nsmap, 
    	    soapC.cpp, 
    	    soapServer.cpp, 
    	    soapServerLib.cpp,
    	    soapClient.cpp, 
    	    soapClientLib.cpp, 
    	    ns.xsd,
    	    TextService.processData.req.xml
    	    TextService.processData.res.xml
      


    3) Implementieren der Service Klasse
    Implementieren der eigenständigen Service-Klasse <gSoapTextService.cpp>. Diese Klasse besitzt Serverfunktionalität.

      	#include "soapH.h"
    	#include "stdsoap2.h"
    	#include "TextService.nsmap"
    
    	...
    	main() {
    	    // Serverfunktionalität
    	    soap_init2(..);
    	    soap_bind(..);
    	    soap_accept(..);
    	    soap_serve(..);
    	    soap_destroy(..);
    	    soap_end(..);
    	    soap_done(..);
    		...
    	}
    	
    	// Service
    	int ns__processData(char ** request, char** response){
    	  ...
    	}
       

    4) Kompilieren der Service-Klasse
    Befehl:
    g++ -Wno-deprecated -I/<gsoap-path> -o gSoapTextService gSoapTextService.cpp soapC.cpp soapServer.cpp soapClient.cpp <gsoap-path>/stdsoap2.cpp


    5) gSOAP Webservice starten
    Der gSOAP standalone Webservice kann durch Aufruf der Objektdatei gestartet werden.
    Befehl: gSoapTextService


    Erstellung des gSOAP Clients

    1) Erstellen der Headerdatei
    Die Headerdatei <cTextClient.h> ist identisch zu <gSoapTextService.h>. Diese Datei kann zum Erzeugen der Stub-Klassen verwendet werden. Es sind nur Namensersetzungen zu machen.


    2) Erzeugen der für den Client notwendigen Stub- und Skeleton-Klassen
    Die Implementierung einer SOAP-Clientanwendung benötigt eine Stub-Routine für jede entfernte Methode, die der Client aufrufen soll. Diese Klassen werden automatisch durch den Stub- und Skeleton-Compiler der gSOAP-Bibliothek soapcpp2 erzeugt.

    Befehl: soapcpp2 -I/<gsoap-path> cTextClient.h

    (Bis hierher ist alles identisch zur Erzeugung des Dienstes.)


    3) Implementierung der Client-Klasse

            	...
    	main() {
    	    struct soap soap;
    	    soap_init(&soap); 
    	   
    	    // remote call	
    	    soap_call_ns__processData(..);
    		...
    	}
       

    4) Kompilieren der Client-Klasse
    Befehl:

    g++ -Wno-deprecated -I/<gsoap-path> -o  cTextClient cTextClient.cpp soapC.cpp soapClient.cpp <gsoap-path>/stdsoap2.cpp


    5) gSOAP Client starten
    Der gSOAP Client kann durch Aufruf der Objektdatei gestartet werden.

    Befehl: cTextClient -i ExampleOutput_RDF


    Erstellung des Axis Clients

    Es soll ein Axis-Client erstellt werden, der sich mit dem gSOAP Server verbinden kann.

    1) Erstellen der clientseitigen Klassen
    Mit dem WSDL-Parser WSDL2Java und der WSDL-Datei des Services kann die Stub-Klasse für den Java-Client erstellt werden. Zuvor muss aber die WSDL-Datei in JavaTextClient.wsdl umbenannt werden. Innerhalb der WSDL-Datei ist ebenfalls diese Namensersetzung durchzuführen. Ausserdem muss der Port kontrolliert werden (hier: 1444).

    Befehl: java org.apache.axis.wsdl.WSDL2Java JavaTextClient.wsdl

    Eine Verzeichnisstruktur gemäß dem in der WSDL-Datei eingestellten Namensraum wird automatisch erstellt. Die Klassen (Stub, Locator und Interfaces) werden dort gespeichert.


    2) Erstellen eines eigenen Clients
    Die Clientklasse wird nicht automatisch erzeugt. Folgender Code dient dem Aufruf des entfernten Webservices. Der Methodenname wurde in der WSDL-Datei festgelegt.

              
               // Make a service	
    	   TextService service = new TextServiceLocator();
    
    	   // use the service to get a stub which implements the SDI
    	   TextServicePortType port = service.getTextService();
    
    	   // make the actual call
    	   String response = port.processData(stringdata);
    	    ...	
        


    3) Kompilieren der Klasse: <JavaTextClient.java>
    Befehl: javac -d build <package-path>JavaTextClient.java


    4) Starten des Clients
    Befehl: java <package-path>JavaTextClient ExampleOutput_RDF