Schnittstelle für programmierbare Web-Services

Vier nicht programmierbare Web-Services stehen bereits zur Verfügung, die das Protokoll „SOAP“ für entfernte Aufrufe verwenden. Das sind zum einen der Datenexport, der Datenimport und die entfernte Suche als spezialisierte Web-Services. Darüber hinaus kann jede Hintergrund-Anwendung über „CallApplication“ als Web-Service zustandslos aufgerufen werden. Diese Web-Services-Schnittstelle verwendet die frei erhältliche Web-Service-Bibliothek „Apache Axis“.

Zusätzlich steht Ihnen eine weitere Schnittstelle für programmierbare Web-Services zur Verfügung. Damit können Sie eigene Web-Services bei Bedarf als SOAP-Service oder als REST-Service implementieren. Diese Web-Service-Schnittstelle verwendet die frei erhältliche Web-Service-Bibliothek „Apache CXF“. Mehr Informationen über CXF erhalten Sie auf folgender Website:

http://cxf.apache.org/[1]

Mit der Auslieferung erhalten Sie sowohl Beispiel-SOAP- und -REST-Services als auch ein Beispiel-SOAP-Client, die in Java implementiert sind.

In dieser Dokumentation werden die Schritte beschrieben, die für die Entwicklung eigener programmierter Web-Services erforderlich sind, sowie Beispiel-Web-Services und -Clients. Auch das Tool „Soap Ui“ zum Testen von SOAP- und REST-Services wird kurz erklärt.

1                     Zielgruppe

  • Anwendungsentwickler
  • Technische Berater

2              Begriffsbestimmung

Hypermedia

Die textbasierte Verknüpfung von Hypertext und Multimediadaten. Hypermedia beruht auf dem Konzept von Verknüpfungen (Hyperlinks). Diese sind vor allem aus der HTML bekannt und ermöglichen dem Benutzer, im Web zu navigieren oder eingebundene Daten wie PDF-Dokumente zu öffnen.

JAXB

Abkürzung für „Java Architecture for XML Binding“. Eine Java-Schnittstelle, die beschreibt, wie die Daten aus einer XML-Schema-Instanz automatisch an Java-Klassen gebunden werden, und wie diese Java-Klassen aus einem XML-Schema generiert werden.

JAX-RS

Abkürzung für „Java API for RESTful Web Services“: Die Spezifikation der Java-Schnittstelle, die die Verwendung des REST-Architekturstils im Rahmen von Webservices ermöglicht und vereinheitlicht.

JAX-WS

Abkürzung für „Java API for XML Web Services“: Die Spezifikation der Java-Schnittstelle für die Erstellung von Web-Services.

Repräsentation

Eine Repräsentation ist jede nützliche Information über den Zustand einer Ressource. Die Repräsentation stellt eine Ressource in einem definierten Format dar. Die Repräsentation einer Ressource kann auf weitere Ressourcen verweisen. Folgende Repräsentationen können zum Einsatz kommen: XML, HTML, CSV, Binäre Formate, den Text ohne definierte Sturktur (text/plain).

Request

Eingaben oder Interaktionen des Benutzers werden durch den Computer des Benutzers, den so genannten Client, über das Netzwerk an den Server geschickt. Die vom Server empfangenen Daten werden als Request bezeichnet. Nach der Datenverarbeitung schickt der Server dem Client als Antwort eine Bestätigung oder neue Daten (Response). Die Kommunikation zwischen Client und Server besteht somit immer aus Request und Response.

Response

Eingaben oder Interaktionen des Benutzers werden durch den Computer des Benutzers, dem so genannten Client, über das Netzwerk an den Server geschickt. Der Server verarbeitet einen Request und schickt dem Client als Antwort eine Bestätigung oder neue Daten. Diese Antwort wird als Reponse bezeichnet. Die Kommunikation zwischen Client und Server besteht somit immer aus Request und Response.

REST

Abkürzung für „Representational State Transfer“. Ein Architekturstil für den Austausch von Nachrichten in verteilten Hypermedia-Informationssystemen auf HTTP-Basis. Es besitzt keinen Protokollcharakter und ist momentan nicht standardisiert. Es müssen keine Protokoll-Konventionen im Unterschied zum SOAP bekannt sein, damit Client und Server sich verständigen können. Die zentrale Rolle spielen die folgenden Grundprinzipien:

  • Adressierbarkeit der Ressourcen.
  • Verwendung von Hypermedia auf Basis von HTML oder XML.
  • Nutzung der Standard-HTTP-Operationen.
  • Zustandslosigkeit der Kommunikation, die sich nicht etwa auf den serverseitigen Zustand bezieht. REST schreibt vor, dass dieser Zustand entweder vom Client gehalten oder vom Server in einen Ressourcenstatus umgewandelt wird. Nicht gewollt ist ein serverseitig abgelegter, transienter, clientspezifischer Status über die Dauer eines Requests hinweg.

REST-konforme HTTP-Nutzung

Englisch „RESTful http“. Die Nutzung der HTTP-Operationen wie folgt:

  • GET: Anfordern von Daten vom Server.
  • POST: neue Daten auf dem Server ablegen.
  • PUT: vorhandene Daten aktualisieren.
  • DELETE: Daten löschen.
  • HEAD: Metadaten zu einer Ressource anfordern.
  • OPTIONS: prüfen, welche Operationen auf einer Ressource zur Verfügung stehen.

REST-Service

Ein Web-Service, bei dem der REST-Architekturstil eingesetzt wird.

(Web)-Ressource

Der Begriff „Web-Ressource“ (auch „Ressource“ genannt) wird verwendet für eine Quelle an einer beliebigen Stelle im Web, die durch einen URI eindeutig identifizierbar ist (siehe auch Norm RFC 3986). Als Beispiele der Web-Ressourcen sind Dateien, Grafiken, Internet-Dienste und Servlets zu nennen sowie Sammlungen von anderen Ressourcen, die über URIs adressiert und angesprochen werden können. Eine Ressource kann mehrere Repräsentationen haben.

SOAP

Abkürzung für „Simple Object Access Protocol“. Ein XML-basiertes Protokoll für den Austausch von Nachrichten in verteilten Systemen. SOAP wird zur Kommunikation zwischen Web-Services-Clients und –Servern verwendet.

SOAP-Service

Ein Web-Service, der das Protokoll „SOAP“ für entfernte Aufrufe verwendet.

WADL

Abkürzung für „Web Application Description Language“. Die Beschreibungssprache für REST-konforme Web-Services.

WSDL

Abkürzung für „Web-Services Description Language“. Die Beschreibungssprache für die Schnittstelle zu einem Web-Service.

3              Beschreibung

Mit der Schnittstelle für programmierbare Web-Services können Sie einen Web-Service als SOAP-Service oder als REST-Service entwickeln. Die Entscheidung, ob ein SOAP- oder REST-Service zum Einsatz kommt, hängt von den konkreten Anforderungen ab.

3.1        Voraussetzungen

Der SAS, auf dem ein programmierbarer Web-Service ausgeführt wird, muss mit dem Web-Server gestartet werden. Dadurch wird auch der Web-Service-Server gestartet. Dies ist der Normallfall im System. Der Web-Service-Server kann nicht getrennt vom Web-Server gestartet werden.

3.2        Einen programmierbaren Web-Service entwickeln

Die Entwicklung eines programmierbaren Web-Services besteht aus mehreren Schritten: vom Erfassen des Entwicklungsobjektes „Anwendung“ bis zum Implementieren der inneren Java-Klasse, in der die Funktionalitäten des Web-Services realisiert sind.

3.2.1    Entwurf der Web-Service-Schnittstelle

Die Schnittstelle eines zu programmierenden Web-Services muss gemäß den technischen und betriebswirtschaftlichen Anforderungen entworfen werden. Dabei ist zu beachten, dass die Infrastruktur, die für die Realisierung eines Web-Services im System zur Verfügung steht, nicht geeignet ist, große Datenmengen zu transportieren. Die empfangenen oder gesendeten Daten müssen unter Umständen vollständig im Hauptspeicher des Application-Servers aufbereitet werden. Dies kann den Application-Server stark belasten und erhebliche Leistungseinbussen verursachen.

Hinweis:

Da die Schnittstelle für programmierbare Web-Services mithilfe von „Apache CXF“ realisiert ist, können Sie für Debug-Zwecke die Informationen unter folgender Website benutzen:

http://cxf.apache.org/docs/debugging-and-logging.html[2]

Falls während der Anfrage des Clients innerhalb der Web-Service-Implemen­tierung Meldungen in der Message-Queue entstehen, werden diese nicht automatisch an den Client zurückgegeben. Die Web-Service-Implemen­tierung hat die Aufgabe, diese Meldungen bei Bedarf an den Client zurückzugeben.

3.2.2    Entwicklungsobjekte vom Typ „Java-Klasse“ und „Anwendung“ erfassen

Erfassen Sie ein Entwicklungsobjekt vom Typ „Java-Klasse“. Wir empfehlen, die Java-Klasse und die Anwendung identisch zu nennen und den Suffix „Service“ zu verwenden.

Der Namensraum sollte wie der entsprechende .log-Namensraum beginnen, und statt auf „.log“ auf „.soap“ oder „.rest“ enden.

Die Java-Klasse muss von der abstrakten Klasse CisWebServiceApplication abgeleitet sein. Diese Oberklasse definiert die Methode init(). Die weitere Implementierung ist abhängig davon, ob ein SOAP- oder ein REST-Service entwickelt wird.

Danach muss ein Entwicklungsobjekt „Anwendung“ erfasst werden. Der voll qualifizierte Name der Anwendung dient als die Identifikation des Web-Services.

Der Typ der Anwendung muss „RPC-Dienst“ sein. Als Besondere Verwendung muss entweder „SOAP-Service“ oder „REST-Service“ ausgewählt werden.

Hinweis:

Falls der Anwendung mit der besonderen Verwendung „REST-Service“ die Java-Klasse zugeordnet ist, in der ein SOAP-Service definiert und implementiert wurde, oder umgekehrt, dann wird das erst beim Aufruf des Services festgestellt und eine Fehlermeldung ausgegeben.

3.2.3    Anfrage-URI

3.2.3.1      Anfrage-URI eines Web-Services

Um die Web-Services aufzurufen muss ein eigener, für den jeweiligen Web-Service spezifischer URI aufgerufen werden. Die Struktur dieses URI sieht wie folgt aus:

  • Für einen SOAP-Service

https://<basis-url>/services/soap/<vollqualifizierter Name der Anwendung>?oltp=<Datenbankname>

Der Bestandteil „services/soap“ des Anfrage-URI signalisiert dem Web-Service-Server, dass ein SOAP-Service angesprochen wird.

  • Für einen REST-Service

https://<basis-url>/services/rest/<vollqualifizierter Name der Anwendung>/<Ressource>/<mögliche Parameter>/?oltp=<Datenbankname>

Der Bestandteil „services/rest“ des Anfrage-URI signalisiert dem Web-Service-Server, dass ein REST-Service angesprochen wird. Durch den Bestandteil <Ressource> wird die gewünschte Funktionalität angesprochen, die bei Bedarf mit den erforderlichen Parametern aufgerufen wird.

3.2.3.2      Generische Query-Parameter des Anfrage-URI

Folgende generische Query-Parameter können verwendet werden:

Query-Parameter Beschreibung
displayLanguage Gibt die gewünschte Anzeigesprache an.
contentLanguage Gibt die gewünschte Inhaltssprache an.
oltp Name der OLTP-Datenbank.
context Code der gewünschten Organisation.
wsdl Signal an den Web-Service-Server, die WSDL-Datei für einen SOAP-Service bereitzustellen. „wsdl“ muss als erster Query-Parameter angegeben werden.
_wadl Signal an den Web-Service-Server, die WADL-Datei für einen REST-Service bereitzustellen.

Wenn Sie mehrere Query-Parameter verwenden, dann werden diese durch ein kaufmännisches „und“ (&) oder ein Semikolon (;) getrennt.

3.2.4    Einen SOAP-Service entwickeln

In der erfassten Java-Klasse muss eine innere Klasse vorhanden sein, die durch die folgende JAX-WS-Annotation gekennzeichnet ist:

@WebService

Diese Annotation benötigt keine Werte. Die innere Klasse dient als Definition und Implementierung eines SOAP-Services. Der Name der inneren Klasse definiert den Namen des Services in der WSDL-Datei. Wir empfehlen, die innere Klasse nicht auf „Service“ enden zu lassen.

Alle öffentlichen Methoden, die Sie in dieser inneren Klasse implementieren, stehen dem SOAP-Client als funktionale Bestandteile des SOAP-Services zur Verfügung.

Weitere Informationen zu JAX-WS, insbesondere zur Verwendung der Annotation, finden Sie in http://cxf.apache.org/docs/developing-a-service.html[3]

3.2.5    Beispiel eines SOAP-Services

Sie erhalten mit der Auslieferung die folgende Anwendung und die gleichnamige Java-Klasse:

com.cisag.app.system.webservices.service.soap.SOAPExampleService

Die init()-Methode enthält die Initialisierung des internen Object- und Transaction-Managers. Die innere Klasse SOAPExample enthält die Definition und die Implementierung des SOAP-Services. Die Klasse wird durch die Annotation @WebService gekennzeichnet.

Die folgende Methode bietet die Möglichkeit, das Begrüßungswort „Hello“ mit dem Parameter name zu konkatenieren und zurückzugeben:

String sayHello(String name)

Durch die folgende Methode können Sie abfragen, ob ein Vertriebsauftrag mit definierter Art und Nummer existiert.

boolean existSalesOrder(String type, String number)

Durch die folgende Methode wird das Bean SalesOrderResult anhand der definierten Art und Nummer zurückgegeben, das die Information über den Status des Vertriebsauftrages und den Namen des zuständigen Mitarbeiters enthält. Beachten Sie bitte, dass das Bean als statische Java-Klasse programmiert werden muss.

public SalesOrderResult getSalesOrderByBusinessKey(String type, String number)

Hinweis:

Mithilfe der Annotation @WebParam(<“Name eines Parameters>) können Sie die Eingabeparameter der Methoden genauer beschreiben. Dann enthalten die WSDL-Datei und die generierten Klassen nicht Namen wie „argX“, sondern die angegebenen Parameternamen.

3.2.6    SOAP-Version

Standardmäßig verwenden programmierbare SOAP-Services die SOAP-Version 1.2 in der WSDL-Datei. SOAP-Rückgaben werden in der SOAP-Version geschickt, die der Client für die SOAP-Anfrage verwendet hat (SOAP 1.1 oder SOAP 1.2).

Sie können in einem SOAP-Service angeben, dass der SOAP-Service nur SOAP 1.1 unterstützen soll. In dem Fall wird SOAP 1.1 in der WSDL-Datei verwendet. Geben Sie dazu zusätzlich die folgende Annotation an der inneren Klasse an:

@javax.xml.ws.BindingType(value = javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING)

 

Beachten Sie, dass die im Dokument Web-Services-Schnittstelle beschriebenen nicht-programmierbaren Web-Services SOAP 1.1 verwenden.

3.2.7    Zustandsbehaftete SOAP-Services

SOAP-Services können auch zustandsbehaftet aufgerufen werden. Je Service, der in einer Session aufgerufen wird, wird eine Instanz der Anwendung mit zugehörigem Service-Objekt erzeugt. Weitere Aufrufe an denselben Service innerhalb derselben Session werden auf dem bereits erzeugten Service-Objekt aufgerufen.

Ein Service kann daher einen Zustand zwischen verschiedenen Aufrufen speichern, in dem er Attribute in der Anwendungsinstanz oder des Service-Objekts verwendet.

Beachten Sie, dass Sessions bei Nichtbenutzung nach Ablauf einer Wartezeit automatisch beendet werden. Um eine Session offen zu halten, muss daher innerhalb der Wartezeit mindestens ein Aufruf eines beliebigen Web-Services für dieselbe Session erfolgen. Das System bietet hierfür auch die parameterlose Methode „ping“ am SOAP-Service an:

com.cisag.sys.tools.webservices.log.Session

3.2.8    Einen REST-Service entwickeln

In der erfassten Java-Klasse muss eine innere Klasse vorhanden sein, die durch die folgende JAX-RS-Annotation gekennzeichnet ist:

@Path(„Vollqualifizierter Name der REST-Anwendung“)

Diese Annotation benötigt als Wert den voll qualifizierten Namen der erfassten Anwendung, für die der Typ „RPC-Dienst“ und die besondere Verwendung „REST-Service“ festgelegt ist. Dieser Name repräsentiert die Root-Ressource, ein erforderlicher Bestandteil des Anfrage-URI des REST-Services. Des Weiteren muss die innere Klasse einen öffentlichen Konstruktor haben.

Hinweis:

Falls die Annotation nicht den Namen der Anwendung enthält, kann der Service nicht aufgerufen werden.

Die einem REST-Client zur Verfügung stehenden Funktionalitäten des REST-Services werden durch die öffentlichen Methoden (Resource-Methoden) repräsentiert, die mit den JAX-RS-Annotationen gegenzeichnet sind:

  • Request-Method Designator (@GET oder @PUT oder @POST oder @DELETE)
  • @Path („Name der Ressource und ggf. weitere Parameter“)

Die Werte, die der @Path-Annotation zugeordnet sind, bilden weitere Bestandteile des Anfrage-URI, die relativ zur Root-Ressource sind. Die Werte können Platzhalter in geschweiften Klammern enthalten.

Hinweis:

Die Namen der Platzhalter, die Parameter des Anfrage-URI repräsentieren, müssen laut Konvention mit einem Großbuchstaben anfangen.

Während der Programmierung der Resource-Methoden sollten Sie das Folgende in Bezug auf HTTP-Operationen beachten:

  • GET

GET fragt die Repräsentation einer Ressource ab. Anfragen sollten frei von Seiteneffekten sein.

  • POST

Mit POST kann einer Ressource etwas hinzugefügt werden. POST ist nicht frei von Seiteneffekten.

  • PUT

Neue Ressourcen können mit PUT erzeugt oder der Inhalt bestehender Ressourcen kann mit PUT ersetzt werden.

  • DELETE

Ressourcen können mit DELETE gelöscht werden.

Beachten Sie bitte dabei auch die folgende Beschreibung der JAX-RS:

Java™ API for RESTful Web Services http://jsr311.java.net/nonav/releases/1.1/spec/spec.html[4]

Hinweise:

Weitere nützliche Informationen über die Annotationen, die zum Einsatz bei der Realisation eines REST-Services kommen können, finden Sie unter der Seite http://cxf.apache.org/docs/jax-rs-basics.html[5]. Einige der Annatotionen werden in im Beispiel der vorliegenden Dokumentation erklärt.

In den Kommentaren von Resource-Methoden finden Sie Informationen darüber, wie eine Funktionalität des REST-Services aufgerufen werden kann. Alle Funktionalitäten die durch die HTTP-Operation „GET“ gekennzeichnet sind, können direkt im Internet-Explorer aufgerufen werden. Für weitere HTTP-Opera­tionen kann das Tool „Soap Ui“ verwendet werden.

3.2.9    Beispiel eines REST-Services

Sie erhalten mit der Auslieferung folgende Anwendung und die gleichnamige Java-Klasse:

com.cisag.app.system.webservices.service.rest.RESTExampleService

Die init()-Methode enthält die Initialisierung des Object- und Transaction-Managers. Die innere Klasse RESTExample enthält die Definition und die Implementierung des REST-Services. Die Klasse wird durch folgende Annotation gekennzeichnet:

@Path(“com.cisag.app.system.webservices.service.rest.RESTExampleService”)

Die folgende Resource-Methode bietet die Möglichkeit, das Begrüßungswort „Hello“ mit gegebenem Parameter name zu konkatenieren und die Repräsentation standardmäßig als plain/text zurückzugeben:

@GET

@Path(“sayhello/{Name}”)

public String sayHello(@PathParam(“Name”) String name)

Die Annotation @GET gibt an, dass die HTTP-GET-Methode für die Anfrage verwendet werden muss. Die Annotation @Path enthält den Wert “sayhello/{Name}”, dabei ist „sayhallo“ die Identifikation der Funktionalität, {Name} ist der  erforderliche Platzhalter, der durch die weitere Annotation @PathParam(„Name“) mit dem Resource-Methoden-Parameter „Name“ verknüpft ist.

Durch die folgende Resource-Methode können Sie anfragen, ob ein Vertriebsauftrag mit definierter Art und Nummer existiert.

@GET

@Path(“salesOrderAvailable/{Type}/{Number}”)

public String existSalesOrder(@PathParam(“Type”) String type, @PathParam(“Number”) String number)

Die folgende Resource-Methode liefert das Bean SalesOrderBean anhand der definierten Art und Nummer zurück, das die Information über die Art, die Nummer, den Status des Vertriebsauftrages und den Namen des zuständigen Mitarbeiters enthält:

@GET

@Path(“getSalesOrder/{Type}/{Number}”)

@Produces(MediaType.APPLICATION_XML)

public SalesOrderBean getSalesOrderByBusinessKey(@PathParam(“Type”) String type, @PathParam(“Number”) String number)

Die Annotation @Produces beschreibt die Repräsentation als XML-Form. Beachten Sie, dass das Bean für die JAXB-Unterstützung mit der Annotation @XmlRootElement(name = “SalesOrderBean”) gekennzeichnet wird.

Die folgende Resource-Methode erzeugt im Arbeitsspeicher eine neue Instanz des Beans SalesOrderBean mit der angegebenen Art, der Nummer und den Status und gibt die Repräsentation als HTML zurück.

@POST

@Path(“newSalesOrderBean/{Type}/{Number}/{orderStatus}”)

@Produces(MediaType.TEXT_HTML)

public SalesOrderBean newSalesOrder(@PathParam(“Type”) String type, @PathParam(“Number”) String number, @PathParam(“OrderStatus”) short orderStatus)

Die Instanz wird nicht gemerkt. Im Unterschied zu anderen Resource-Methoden ist diese Methode durch die Annotation @POST gekennzeichnet.

Hinweis:

Neben der Annotation @PathParam steht auch die Annotation @QueryParam zur Verfügung, mit der auf Query-Parameter des Anfrage-URI zugegriffen werden kann. Auf diese Weise kann der Service eigene Query-Parameter definieren, die ein Client als Query-Zeichenkette übergeben kann. Verwenden Sie dafür als erstes Zeichen des Query-Parameternamens einen Großbuchstaben. Query-Parameternamen, die mit Kleinbuchstaben beginnen, sind für die System-Engine reserviert.

3.3        Abrufen der WSDL-/WADL-Datei

Die WSDL- oder die WADL-Datei wird für die Entwicklung eines Web-Service-Clients benötigt. Die Struktur des jeweiligen Anfrage-URIs sieht wie folgt aus:

  • Für SOAP-Services:

https://<basis-uri>/services/soap/<vollqualifizierter Name der Anwendung>?wsdl

Der Bestandteil des Anfrage-URIs „wsdl“ signalisiert dem Semiramis-Web-Service-Server, dass eine WSDL-Datei vorbereitet und zur Verfügung gestellt werden muss. Nach der Angabe des Anfrage-URI in der Adressleiste des Internet Explorers erscheint dazu das Authentifizierungsdialogfenster. Nach der erfolgreichen Authentifizierung wird die WSDL-Datei angezeigt. Sie können diese mithilfe der „Speichern unter…“-Aktion des Internet Explorers speichern.

  • Für REST-Services:

https://<basis-url>/services/soap/<vollqualifizierter Name der Anwendung>?_wadl

Der Bestandteil des Anfrage-URIs „_wadl“ signalisiert dem Semiramis-Web-Service-Server, dass eine WADL-Datei vorbereitet und zur Verfügung gestellt werden muss. Nach der Angabe des Anfrage-URIs in der Adressleiste des Internet Explorers erscheint dazu das Authentifizierungsdialogfenster. Nach der erfolgreichen Authentifizierung erscheint das Dateidownload-Dialogfenster. Sie können die WADL-Datei speichern. Beachten Sie, dass die WADL-Datei unter Umständen unvollständig ist, beispielsweise könnten Parameter fehlen. Das hängt von der Programmierung des jeweiligen REST-Services ab.

3.4        Authentifizierung und Berechtigungen

Um einen Web-Service aufrufen zu können, muss ein Client sich am Web-Server authentifizieren. Die Authentifizierung erfolgt durch Digest-Kennwort-Authentifizierung oder durch ein Client-Zertifikat. In der Beschreibung des Beispiel-Clients in Kapitel 4.6.1 Beispiel SOAP-Service-Client erfolgt die Authentifizierung per Client-Zertifikat.

Programmierbare Web-Services sind Anwendungen. Daher muss ein Benutzer die Berechtigung für das Öffnen der Anwendung besitzen, um den Web-Service aufrufen zu können.

3.5        Unterstützung zur Fehlersuche

Der Semiramis-Web-Service-Server bietet die Möglichkeit, Informationen über Anfragen von Clients auszugeben. Dies gilt sowohl für die nicht programmier­baren wie für die programmierbaren Web-Services.

Aktivieren Sie hierzu das Klassendebugging der Javaklasse com.cisag.sys.kernel.webservices.CisWebServicesResource auf dem SAS, der von Clients aufgerufen wird. Auf der Toolshell erscheinen abhängig von der Debuggingstufe folgende Ausgaben:

Debuggingstufe Ausgaben
INFO Für jeden Aufruf eines Web-Services erfolgt eine Ausgabe beim Beginn und am Ende der Verarbeitung im SAS.

Ausgegeben werden: Session-Nummer, HTTP Method, Anfrage-URI, Verarbeitungszeit.

FINEST Zusätzlich zu den Ausgaben in der Debuggingstufe „INFO“ wird mit der Stufe „FINEST“ der Inhalt (HTTP Body) der Anfrage des Clients und der Antwort des Web-Services ausgegeben.

Die Ausgaben können über den Toolshell-Befehl Klasse debuggen (dbgcls) für einen laufenden SAS ein- und ausgeschaltet werden.

3.6        Beispiele für Web-Service-Clients

3.6.1    Beispiel SOAP-Service-Client

Sie erhalten mit der Auslieferung folgendes Beispiel für einen SOAP-Service-Client. In diesem Client wird geprüft, ob ein Vertriebsauftrag existiert oder nicht.

Die folgende Klasse enthält die eigentliche Client-Implementierung:

com.cisag.app.system.webservices.service.soap.client.SOAPExampleClient

Zusätzlich werden die folgenden Klassen für die Client-Programmierung benötigt:

com.cisag.app.system.webservices.service.soap.client.ExistSalesOrder

com.cisag.app.system.webservices.service.soap.client.ExistSalesOrderResponse

com.cisag.app.system.webservices.service.soap.client.GetSalesOrderByBusinessKey

com.cisag.app.system.webservices.service.soap.client.GetSalesOrderByBusinessKeyResponse

com.cisag.app.system.webservices.service.soap.client.ObjectFactory

com.cisag.app.system.webservices.service.soap.client.SalesOrderResult

com.cisag.app.system.webservices.service.soap.client.SayHello

com.cisag.app.system.webservices.service.soap.client.SayHelloResponse

com.cisag.app.system.webservices.service.soap.client.SOAPExample

com.cisag.app.system.webservices.service.soap.client.SOAPExampleService

Diese Klassen werden durch das Tool wsimport aus der WSDL-Datei generiert. Das Tool wsimport ist seit Java 6 Bestandteil des JDK.

Die WSDL-Datei wird durch folgende Angabe erzeugt:

https://<basis-uri>/services/soap/com.cisag.app.system.webservices.service.soap.SOAPExampleService?wsdl

Statt des Platzhalters <basis-uri> wird die reale Adresse angegeben.

Danach wird das Tool wsimport wie folgt unterhalb von <JDK-Verzeichnis>/bin aufgerufen:

wsimport -p com.cisag.app.system.webservices.service.soap.client   -d <Pfad für die .class Dateien> -s <Pfad für die Quell-Dateien> <Pfad mit dem Namen der WSDL-Datei> -Xnocompile -extension

Statt den „Pfad“-Platzhaltern werden die realen Pfade angegeben.

Die folgende Klasse enthält nach der Generierung den Pfad zur WSDL-Datei:

com.cisag.app.system.webservices.service.soap.client.SOAPExampleService

Dieser Pfad wird durch den folgenden URI ersetzt:

<basis-uri>/services/soap/com.cisag.app.system.webservices.service.soap.SOAPExampleService?wsdl&oltp=<oltpname>

Hinweis:

Sie müssen die Platzhalter <basis-uri>  und <oltpname> durch die konkreten Werte des Basis-URIs und des Namens der OLTP-Datenbank ersetzen.

Die folgende Klasse enthält die main-Methode, in der die Prüfungen der Parameter stattfinden:

com.cisag.app.system.webservices.service.soap.client.SOAPExampleClient

In dieser Methode wird Folgendes ausgeführt:

  • eine Instanz von SOAPExampleService wird erstellt
  • ein Serviceobjekt wird erstellt
  • eine Authentifizierung wird durchgeführt
  • die Methode des SOAP-Services existSalesOrder(salesOrderType, salesNumber) wird aufgerufen

Der Aufruf des Clients muss außerhalb des Systems wie folgt erfolgen:

com.cisag.app.system.webservices.service.soap.client.SOAPExampleClient SOAPServiceAddress   userCertificateFileName userCertificateFilePassword serverCertificateFileName salesOrderType salesNumber

Geben Sie statt SOAPServiceAddress die vollständige Adresse des SOAP-Services inklusive dem Namen der OLTP-Datenbank an, z. B. https://qas.kauftreu.com/services/soap/com.kauftreu.app.system.webservices.service.soap.SOAPExampleService?oltp=QAS51000

Geben Sie statt salesOrderType und salesNumber die Art des Vertriebsauftrages und dessen Nummer an.

Geben Sie statt userCertificateFileName und serverCertificateFileName den vollständigen Pfad und den Dateinamen der JKS-Datei an.

Hinweis:

Der Beispiel-SOAP-Client darf nicht innerhalb des Systems gestartet werden. Die betreffenden Klassen müssen kopiert und kompiliert werden (z. B. in einem eigenen Eclipse-Projekt). Des Weiteren darf die CXF-Bibliothek nicht im Klassenpfad vorhanden sein. Wenn Sie versuchen, den Client im System zu starten, dann wird die folgende Ausnahme ausgegeben:

Exception in thread “main” com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:121) at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:142)at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:83)at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:105)

Der Beispiel-SOAP-Client ist so programmiert, dass alle Anfragen denselben Sessions zugeordnet sind.

3.6.2    Beispiel-REST-Service Client

Sie können das Tool „Soap Ui“ für die einzelnen Anfragen verwenden, das im Kapitel Tool „Soap Ui“ zum Testen von Web-Services beschrieben ist.

4              Tool „Soap Ui“ zum Testen von Web-Services

Das Tool „Soap Ui“ bietet Ihnen die Möglichkeit, sowohl SOAP- als auch REST-Services zu testen. Die weitere Beschreibung bezieht sich auf die Version 3.6.1. Die ausführliche Dokumentation sowie die Installationsanleitungen zum Tool finden Sie unter folgender Adresse:

http://soapui.org/REST-Testing/getting-started.html[6]

Soap-Ui-Einstellungen

Bevor Sie einen Web-Service testen benötigen Sie eine WSDL- oder WADL-Datei. Sie  benötigen auch die JKS-Datei eines Benutzerzertifikates für die Authentifizierung mit dem Kennwort für diese Datei. Das Benutzerzertifikat muss dem jeweiligen Benutzer zugeordnet werden, der den Web-Service testet. Den Pfad zur Datei und das Kennwort geben Sie unter der Rubrik „SSL Settings“ des Dialoges „SoapUi Preferences“ an.

Empfehlung:

Wir empfehlen, dass Sie unter der Rubrik „HTTP Settings“ den Wert 120000 für „Socket Timeout“ eingeben.

Das Dialog-Fenster „SoapUi Preferences“ können Sie aufrufen, indem Sie entweder die Tastenkombination „CTRL+ALT+P“ drücken oder unterhalb von dem Menü „File“ den Menüeintrag „SoapUi Preferences“ auswählen.

Neues Soap-Ui-Projekt

Nachdem Sie die Soap-Ui-Einstellungen vorgenommen haben, legen Sie ein neues Soap-Ui-Projekt an, indem Sie die Tastenkombination „CTRL+N“ drücken oder unterhalb von dem Menü „File“ den Menüeintrag „New SoapUi Project“ auswählen. Ein Dialog-Fenster erscheint, in das Sie den Namen des Projektes und den Pfad zur WSDL- oder WADL-Datei angeben. Nachdem Sie „OK“ gedrückt haben, entsteht ein Projekt, das hierarchisch aufgebaut ist. Einzelne Knoten repräsentieren entweder den ganzen Web-Service oder einzelne Funktionalitäten oder deren HTTP-Operationen (nur für REST-Service).

Bitte beachten Sie, dass die Namen der generischen Query-Parameter (z. B. „oltp“ bzw. „context“) nicht Bestandteil der WSDL- oder WADL-Datei sind. Sie müssen diese Parameter manuell eingeben:

  • Für SOAP-Service klappen Sie die Knoten mit zu testenden Funktionalitäten auf, bis Sie zum Knoten „Request<Nummer>“ wechseln können. Dann markieren Sie die Adressleiste des Dialog-Fensters, wählen den Punkt „[edit current…] und fügen den gewünschten Parameter dem URI hinzu.
  • Für REST-Service klappen Sie den Knoten auf, der den Namen des Web-Services trägt. Das sollte der Name der Anwendung sein, die Sie in Semiramis erfasst haben. Doppelklicken Sie darauf. Ein Dialog-Fenster erscheint, in dem Sie weitere Parameter hinzufügen können.

Um auf einen Web-Service zugreifen zu können, klappen Sie die Knoten mit zu testenden Funktionalitäten auf, bis Sie zum Knoten „Request<Nummer>“ wechseln können. Klicken Sie auf den Knoten, dann erscheint ein Dialog-Fenster, in das Sie sowohl die Anfragen (Requests) an Web-Services stellen als auch die Antworten (Response) des Web-Services ansehen können.

Hinweis:

Der SAS, dessen URI bei der Abfrage der WSDL- oder WADL-Datei verwendet wurde, muss gestartet sein. Wenn Sie sicher sind, dass auf einem anderen Applicaton-Server derselbe Web-Service ausgeführt wird, dann können Sie im „Request“-Dialog-Fenster den URI editieren, indem Sie die Adressleiste des Dialog-Fensters markieren und den Punkt „[edit current…] auswählen.

Unter Umständen kann vorkommen, dass die WADL-Datei nicht vollständig ist, z. B. können die notwendigen Parameter für die Abfrage fehlen. In diesem Fall fügen Sie die notwendigen Parameter manuell hinzu.

Mit dem Tool „Soap Ui“ können diverse Logdateien angezeigt werden. Im unteren Bereich des Hauptfensters werden z. B. die Karteireiter „Soap Ui log“ und „error log“ angezeigt.

[1] Stand der Quelle: 31.01.2011

[2] Stand der Quelle: 31.01.2011

[3] Stand der Quelle: 31.01.2011

[4] Stand der Quelle: 31.01.2011

[5] Stand der Quelle: 31.01.2011

[6] Stand der Quelle: 31.01.2011

Czy ten artykuł był pomocny?