gSOAP: C/C++ Web Services and Clients |
gSOAP: User Guide |
Erstellung eines gSOAP Webservices eines gSOAP-Clients und eines Axis-Clients |
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
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
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
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
Inhaltsverzeichnis |
DFKI GmbH German Research Center for Artificial Intelligence |