Westfälische Wilhelms-Universität Münster Ausarbeitung im Rahmen des Softwaretechnik Seminars „Java Web Services“ Jürgen de Braaf WS 2004/ 2005 Themensteller: Prof. Dr. Herbert Kuchen Betreuer: Ch. Lembeck Institut für Wirtschaftsinformatik Praktische Informatik in der Wirtschaft Inhaltsverzeichnis 1 Einleitung................................................................................................................... 1 1.1 Definition von Web Services............................................................................ 1 1.2 Eigenschaften von Web Services...................................................................... 1 1.3 Apache EXtensible Interaction System (Axis) ................................................. 2 2 Einführendes Beispiel ................................................................................................ 2 3 Die drei Haupttechnologien von Web Services......................................................... 6 3.1 Simple Object Access Protocol (SOAP)........................................................... 7 3.2 Web Service Description Language (WSDL) ................................................ 11 3.3 Universal Description, Discovery, and Integration (UDDI)........................... 13 4 Zusammenfassung ................................................................................................... 16 5 Literaturverzeichnis ................................................................................................. 17 II Kapitel 1: Einleitung 1 Einleitung Im Folgenden werden die einzelnen Konzepte von Web Services unter der Programmiersprache Java vorgestellt. Hierbei wird als SOAP-Implementierung Axis (Apache EXtensible Interaction System) der Apache Software Foundation eingesetzt, unter der auch die nachfolgenden Beispielprogramme ausgeführt werden. 1.1 Definition von Web Services Nach [ChJe03] ist i. w. S. ein Web Service ein Stückchen Geschäftslogik, auf das über standardisierte Internet Protokolle wie HTTP oder SMTP zugegriffen werden kann und sich irgendwo im Internet befindet. I. e. S. sieht man jedoch Web Services als Sammelbegriff neuer Technologien wie SOAP, WSDL, UDDI. Diese neuen Technologien basieren auf standardisiertem XML und sind nicht Teil eines proprietären Standards, wie zum Beispiel CGI-Skripte. 1.2 Eigenschaften von Web Services XML-basiert Das Einsetzen von XML als Basis soll Web Services von jeglichen Plattformen, Betriebssystemen und Netzwerkprotokollen unabhängig machen. Dieser Anspruch unterscheidet Web Services eindeutig von vorherigen Technologien. Lose gekoppelt Durch lose Kopplung will man erreichen, dass der Client unabhängig vom Interface eines Web Service gestaltet werden kann. Ändert sich das Interface mit der Zeit, so soll der Client weiterhin den Web Service ohne Anpassung nutzen können. Grobkörnig Web Services sollen grobkörnige Dienste darstellen, hinter denen viele verschiedene, einzelne feinkörnige Operationen stehen und Damit möchte man Dienste anbieten, die auf der Ebene eines gesamten Unternehmens nützlich sind. Synchrone oder asynchrone Ausführung Bei synchronen Aufrufen blockiert der Client und wartet auf die Antwort des Dienstes. Im Gegensatz dazu können Clients bei asynchronen Aufrufen weiterarbeiten und 1 Kapitel 2: Einführendes Beispiel Ergebnisse zu einem späteren Zeitpunkt abholen. Asynchrone Aufrufe unterstützen dabei die lose Kopplung von Systemen. Unterstützung von Remote Procedure Calls (RPCs) Der Web Service Standard erlaubt das Aufrufen entfernter Prozeduren, Funktionen und Methoden. Diese geben ihre Eingabe- und Ausgabeparameter bekannt, die wiederum vom Web Service unterstützt werden müssen. Dabei kann der Web Service die Dienste selbst bereitstellen oder den eingehenden Aufruf in einen Aufruf einer EJB- oder .NETKomponente übersetzen. Unterstützung von Dokumentenaustausch Mithilfe von XML sollen nicht nur Daten, sondern auch komplexe Dokumente ausgetauscht werden können. Zum Beispiel ist der Austausch einer komplexen Bedienungsanleitung oder Bildstruktur denkbar. 1.3 Apache EXtensible Interaction System (Axis) Axis ist eine SOAP-Engine, mit der man Clients, Server und Gateways erstellen kann, die mittels des Kommunikationsprotokolls SOAP miteinander kommunizieren. Dabei stellt Axis eine API bereit, die einem viel Arbeit bei der Formulierung von SOAPAnfragen und Antworten abnimmt. Dies erspart einem XML Dokumente von Hand zu erstellen und zu parsen. Mit der API wird ein stand-alone Server, ein plug-in für den Tomcat-Server und Tools zum Erstellen von WSDL Dokumenten mitgeliefert. 2 Einführendes Beispiel Zunächst betrachten wir ein einfaches Beispiel, anhand dessen später die einzelnen Technologien (SOAP, WSDL, UDDI) vorgestellt werden. Als Beispiel fungiert ein Dienst, der für eine ausgewählte Aktie den aktuellen Kurs zurückgibt. Der Client CheckStockClient formuliert eine einfache SOAP-Anfrage mit einem Parameter, der Wertpapierkennnummer (WKN), an den Web Service MyStockService. Für Testzwecke vollkommen ausreichend besteht der Dienst aus einer Methode, die beim Aufruf eine Zufallszahl zurückgibt, die den aktuellen Aktienkurs repräsentiert. Außerdem wird davon ausgegangen, dass Axis und alle seine Bibliotheken mit Umgebungsvariablen eingerichtet sind und eine Einbindung in den Tomcat-Server erfolgt ist. Für eine 2 Kapitel 2: Einführendes Beispiel Installationsbeschreibung wird auf [Axis04] hingewiesen. Als Referenzadresse wird der lokale Rechner mit der Adresse http://localhost:8080/axis verwendet. Es folgt der Quelltext des Clients und des Dienstes: /* * Dieser Test Client demonstriert eine Web Service Anwendung, * indem für eine bestimmte Aktie (WKN) und Datum der Schlusskurs * vom Server zurückgegeben wird. */ package seminar.webservices; // benötigte Klassen werden importiert import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; import org.apache.axis.utils.Options; import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; /** * Hier folgt die Klasse CheckStockClient, die eine Anfrage * an den Server stellt. */ public class CheckStockClient { /** * Die Klasse besteht nur aus einer main Methode * @param args */ public static void main(String [] args) { try { // Parameter werden in einem Options Objekt verarbeitet // und zwischengespeichert Options options = new Options(args); String endpointURL = options.getURL(); args = options.getRemainingArgs(); String wkn = args[0]; String datum = args[1]; // erstelle ein neues Service Objekt Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress( new java.net.URL(endpointURL) ); // die aufzurufende Methode wird ausgewählt call.setOperationName( new QName("http://webservices.seminar", "serviceStock") ); // Übergabeparameter und zugehörige Formattypen werden eingerichtet call.addParameter( "wkn", XMLType.XSD_STRING, ParameterMode.IN); // Rückgabewert wird definiert call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING); // Service wird aufgerufen und das Ergebnis wird gespeichert double aktienkurs = new Double((String)(call.invoke( new Object[] { wkn } ))).doubleValue(); 3 Kapitel 2: Einführendes Beispiel // Ausgabe des Aktienkurs System.out.println("Der Schlusskurs für die Aktie mit der WKN "+ wkn +" lautet: " + aktienkurs); } catch (Exception e) { ystem.err.println(e.toString()); } } } Quelltext 1: CheckStockClient.java /* * Dieser Test Server demonstriert eine Web Service Anwendung, * indem für eine bestimmte Aktie (WKN) Kurs * vom Client abgefragt werden kann. */ package seminar.webservices; /** * Diese Klasse steht für den Web Service "serviceStock" und wird * durch den Server bei Anfragen aufgerufen und gibt den gewünschten * Aktienkurs zurück. * Für Testzwecke wird eine Zufallszahl zurückgegeben. */ public class MyStockService { // die einzige Methode des Denstes public String serviceStock(String arg) { return new Double((double) (java.lang.Math.random() * double)100)).toString(); } } Quelltext 2: MyStockService.java Nachdem man die Java Klassen kompiliert vorliegen hat, sind folgende Schritte durchzuführen, um den Dienst schließlich bereitzustellen und eine Testabfrage zu starten: 1. Seitens Axis erfolgt das Bereitstellen des Dienstes MyStockService mithilfe eines Web Service Deployment Descriptor (WSDD) im XML Format. Ein WSDD kann natürlich auch für das Entfernen von Diensten benutzt werden. <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="MyStockService" provider="java:RPC"> <requestFlow> <handler type="soapmonitor"/> </requestFlow> <responseFlow> <handler type="soapmonitor"/> </responseFlow> <parameter name="className" value="seminar.webservices.MyStockService"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> Quelltext 3: deploy.wsdd 4 Kapitel 2: Einführendes Beispiel Dieses XML Dokument deklariert den Namensraum Java und definiert diesen Dienst als Remote Procedure Call. Als Parameter wird die Klasse des Dienstes angegeben, die sich im Package seminar.webservices befindet. Mit dem Aufruf java org.apache.axis.client.AdminClient deploy.wsdd in der Kommandozeile wird das WSDD Dokument eingeladen und am Axis Server in das zentrale Diensteverzeichnis server-config.wsdd eingepflegt. Vorausgesetzt die Klasse liegt in dem Klassenverzeichnis des Axis webapps Ordners vor, ist der Dienst nun unter der Adresse http://localhost:8080/axis/services/MyStockService zu erreichen. Eine Liste von allen registrierten Diensten ist unter http://localhost:8080/axis/services aufgeführt. Die XML Anweisungen <requestFlow> und <responseFlow> sind nicht weiter von Bedeutung, da hier nur für Testzwecke standardgemäß der SOAP-Monitor eingebunden wird, der den SOAP-Austausch mitprotokolliert. 2. Ein Aufruf des Kommandos java seminar.webservices.CheckStockClient mit dem Argument -lhttp://localhost:8080/axis/services/MyStockService "30392" in der Kommandozeile ruft den Client mit der Adresse des Dienstes MyStockService und der WKN 30392 auf und sollte bei fehlerfreier Ausführung zur folgender Ausgabe führen: Der Kurs für die Aktie mit der WKN 30392 lautet: 45.741958669707074 (Der Aktienkurswert wird natürlich variieren, da hier eine Zufallszahl verwendet wird.) Ein sehr nützliches Hilfsmittel ist hierbei der vorhin erwähnte SOAP-Monitor, der es ermöglicht, die SOAP-Kommunikation zu verfolgen. In Abbildung 1 sieht man sowohl die vom Client formulierte SOAP-Anfrage, als auch die Antwort des MyStockService. In den nächsten Kapiteln wird der Syntax im Einzelnen erläutert. 5 Kapitel 3: Die drei Haupttechnologien von Web Services Abbildung 1: SOAP-Monitor 3 Die drei Haupttechnologien von Web Services Aus Abbildung 2 entnimmt man die einfache Interaktion einer Web Service Anwendung. Zunächst sucht der Client in einer UDDI-Registrierungsstelle mittels Namen, Bezeichnern, Kategorien oder den von Web Services implementierten Spezifikationen nach einem Dienst und wählt diesen aus. Dort erhält der Client die nötigen Information des Web Service in Form eines WSDL Dokuments, um in Kontakt mit dem Dienst zu treten, indem der Client eine SOAP-Nachricht an den Host abschickt, auf dem sich der Dienst befindet. Hinter diesem Dienst kann sich eine einfache Anwendung verbergen, wie ein Fremdsprachenlexikon, eine komplexe Geschäftslogik, wie das Buchungssystem einer Flugbörse oder der Dienst ist selber wieder nur Teil einer Sammlung von vielen verschiedenen Diensten. Wichtig hierbei ist jedoch die Betrachtung, dass jeder Dienst eine abgeschlossene, sich selbst beschreibende, modulare Einheit darstellt. Exemplarisch werden in Abbildung 2 die Nachrichten über das HTTP-Protokoll verschickt. SOAP ist jedoch unabgängig vom zugrunde liegenden Transportprotokoll und kann genauso mit SMTP oder anderen geeigneten Protokollen kombiniert werden. 6 Kapitel 3: Die drei Haupttechnologien von Web Services Anwendung Dienst HTTP - Anfrage SOAP Prozessor SOAP-Client HTTP - Antwort Diskrete Geschäftslogik WSDL UDDIRegistrierungsstelle Abbildung 2: Interaktion mit einem Web Service 3.1 Simple Object Access Protocol (SOAP) SOAP bildet ohne Zweifel das Rückgrat einer Web Service Anwendung, dessen Entwicklung erst durch XML ermöglicht wurde. Dabei sieht man SOAP zugleich als Kommunikationsprotokoll, RPC-Mechanismus und Standard für Interoperabilität an. Jede SOAP-Nachricht besteht aus einem SOAP-Header und SOAP-Body, die zusammen in einen SOAP-Envelope zusammengehalten werden (siehe Abbildung 3). SOAP - Header SOAP - Block SOAP - Block SOAP - Body SOAP - Block SOAP - Block SOAP - Envelope Abbildung 3: SOAP-Envelope Der SOAP-Envelope Tag besteht, wie die SOAP-Anfrage aus dem Beispielprogramm zeigt (Quelltext 4), aus drei obligatorischen Attributen, die den Namensraum und das Schema angeben. Ein Namensraum in der XML Syntax ist vergleichbar mit der Definition eines package in Java. In Zeile 3-5 leitet das Schlüsselwort xmlns diese 7 Kapitel 3: Die drei Haupttechnologien von Web Services Namensraum- bzw. Schemadeklaration ein. Es ist üblich die URL der Organisation auszuwählen, von der die jeweilige Spezifikation verabschiedet wird. Diese URL muss nicht zwingend existieren, sondern nur die Eindeutigkeit dieses Strings innerhalb der Nachricht ist relevant. In Zeile 3 deklarieren wir den Namensraum SOAP-Env für unseren Envelope und setzen diese Bezeichnung innerhalb des Envelope, Header und Body Tags ein. Den jeweiligen Namensraum eines Tags können wir somit vor dem Doppelpunkt eines Tagnamens erkennen. Die Bezeichnung xsi aus Zeile 4 steht für den Namensraum der XML Schema-Instanz, die in unserem Beispiel in Zeile 11 für die Attributdefinition xsi:type der wkn verwendet wird und der Namensraum xsd aus Zeile 5 steht für den XML Schema-Namensraum, hier in Zeile 11 bei einer String Deklaration xsd:string verwendet. 1 <?xml version="1.0" encoding="UTF-8"?> 2 <SOAP-ENV:Envelope 3 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 5 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 6 <SOAP-ENV:Header> 7 </SOAP-ENV:Header> 8 <SOAP-ENV:Body> 9 10 11 <ns1:serviceStock xmlns:ns1="http://webservices.seminar"> <wkn xsi:type="xsd:string">30392</wkn> </ns1:serviceStock> 12 </SOAP-ENV:Body> 13 </SOAP-ENV:Envelope> Quelltext 4: SOAP-Anfrage Für den SOAP-Header gibt es nach der SOAP 1.1 und SOAP 1.2 Spezifikationen keine Konvention über den Inhalt. Dieser Block kann für Anweisungen an den empfangenen SOAP-Prozessor verwendet werden. Hier kann zum Beispiel die Transaktions-ID übergeben werden, wenn die dahinter liegende Anwendung einen Transaktionsmanager einsetzt. Syntaktisch ähneln sich SOAP-Header und SOAP-Body, wobei die eigentlichen Daten im Body zu finden sind. Das einfache Beispielprogramm aus Kapitel 2 verwendet keine Header Informationen. Im Body in Zeile 10 wird schließlich der Namensraum ns1 mit der virtuellen Adresse deklariert, die hier mit dem package Namen der Dienste Klasse korrespondiert und für den Methodenaufruf serviceStock verwendet wird. Der Methoden Block enthält das Attribut wkn mit der Typdefinition xsd:string und den Wert “30392“. Damit ist diese SOAP-Anfrage, die einen 8 Kapitel 3: Die drei Haupttechnologien von Web Services Methodenaufruf beim Diensteempfänger veranlasst, komplett. Erzeugt wird diese SOAP-Anfrage in der main-Methode der CheckStockClient Java-Klasse. Sie baut das SOAP-Call Objekt zusammen und ruft den Dienst mit der WKN als Parameter auf und speichert den Rückgabewert. 1 <?xml version="1.0" encoding="UTF-8"?> 2 <SOAP-ENV:Envelope 3 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 5 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 9 10 11 12 <SOAP-ENV:Body> <ns1:serviceStockResponse xmlns:ns1="http://webservices.seminar"> <serviceStockReturn xsi:type="xsd:string">45.741958669707074 </serviceStockReturn> </ns1:serviceStockResponse> 13 </SOAP-ENV:Body> 14 </SOAP-ENV:Envelope> Quelltext 5: SOAP-Antwort Der Dienst wiederum antwortet mit einer SOAP-Nachricht, die sich syntaktisch nicht von der jeweiligen Anfrage unterscheidet. Nach guter Konvention fügt man dem Namen der aufgerufenen Methode innerhalb des Body Elements ein „Response“ und dem Rückgabewert ein „Return“ hinzu, um den Antwortcharakter zu verdeutlichen. Wie genau letztendlich die Rückgabe benannt ist, lässt sich dem WSDL Dokument des Dienstes entnehmen. MIME - Header SOAP - Envelope SOAP - Header SOAP - Block SOAP - Block SOAP - Body SOAP - Block SOAP - Block Anhang 1 Anhang 2 Abbildung 4: SOAP mit Anhang 9 Kapitel 3: Die drei Haupttechnologien von Web Services Möchte man mit XML und SOAP auch Anwendungsdaten, wie Bilddateien, Berichte im pdf-Format oder auch komplexe CAD-Dateien versenden, besteht die Möglichkeit das SOAP-Protokoll mit dem MIME-Standard zu kombinieren und wie bei einer eMail beliebige Anhänge mitzuschicken. Dabei werden die einzelnen Blöcke durch MIMEHeader verbunden, indem jeder Header den Beginn des nächsten Blocks und das Ende des vorigen markiert. Der erste Block ist der uns bekannte SOAP-Envelope und jeder Anhang bildet einen darauf folgenden Teil. Um diese so genannten SwA-Nachrichten (SOAP with Attachments) zu konstruieren und dekonstruieren, greift man auf Axis- und JavaMail-APIs zurück. Erweitert man die Anfrage aus Kapitel 2 dahingehend, dass man die Text-Datei Anschrift.txt der SOAP-Nachricht beifügt, so wird ein Referenz Tag <attachment href=“cid:the-attachment“/> mit der Content-ID des Anhangs dem SOAP-Element (Quelltext 6) hinzugefügt. Der Inhalt der Anhang Datei erscheint getrennt durch einen MIME-Header nach dem Schlusstag des SOAP-Envelope mit der entsprechenden Content-ID, die in der Referenz angeben ist. <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope … <SOAP-ENV:Body> <ns1:serviceStock xmlns:ns1="http://webservices.seminar"> <wkn xsi:type="xsd:string">30392</wkn> <attachment href=“cid:the-attachment“/> </ns1:serviceStock> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Quelltext 6: SOAP-Anfrage mit Anhang Bisher wurde in dem hier beschriebenen Beispiel stets ein Remote Procedure Call (RPC) abgesetzt, indem eine Methode am anderen Ende der Leitung aufgerufen wird. Neben diesem SOAP-Typ, der im Deployment Descriptor (Quelltext 3) auf java:RPC Provider gesetzt ist, können genauso SOAP-Nachrichten an message services versendet werden, die keinen expliziten Methodenaufruf erwarten. Der angesprochene Dienst parst die Nachricht wie jedes gewöhnliche XML Dokument und verarbeitet anschließend die enthaltenen Daten weiter. Ferner stellt SOAP einen speziellen Envelope namens Fault-Envelope zur Verfügung. Dieser SOAP-Fault wird bei einem Fehler während der Verarbeitung einer SOAPNachricht durch den Server an den Client zurückgeschickt. Quelltext 7 listet die Struktur einer Fehlerbenachrichtung auf. Das erste Kindelement des SOAP-Body 10 Kapitel 3: Die drei Haupttechnologien von Web Services Elements bildet <SOAP-ENV:Fault>, gefolgt von einem obligatorischen <faultcode> und <faultstring>. Dabei sind die Elemente <faultactor> und <detail> optional. Der <faultcode> entspricht einem von sechs Fault-Codes, die in der SOAP 1.1 Spezifiktion benannt sind. <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope … <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>SOAP-ENV:Server</faultcode> <faultstring>Test Fault</faultstring> <faultactor>/axis/services/MyStockService</faultactor> <detail> … </detail> <SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Quelltext 7: SOAP-Fault-Nachricht 3.2 Web Service Description Language (WSDL) WSDL ist ein XML Syntax zur Beschreibung eines Web Service. Es formuliert, was ein Dienst anbietet, wie man seine Operationen aufruft und wo man ihn schließlich findet. Vergleichbar ist ein WSDL Dokument mit einer Interface Definition Language (IDL), wie sie bei CORBA eingesetzt wird. Anders als bei einer herkömmlichen IDL jedoch, kann WSDL Diente unabhängig vom Nachrichtenformat oder Netzwerkprotokoll beschreiben, die zum Austausch der Nachrichten verwendet werden. Außerdem besteht die Möglichkeit, Nachrichten als abstrakte Beschreibungen der auszutauschenden Daten zu verstehen oder in Form von so genannten Porttypen, abstrakte Sammlungen der Operationen eines Dienstes zu betrachten. Ein Porttyp kann hierbei auch an ein konkretes Protokoll und Datenformat gebunden werden. Da WSDL eine abstrakte Beschreibung der Schnittstelle eines Web Service liefert, kann man dazu übergehen den Quelltext für die Implementierung automatisch daraus abzuleiten und zu erzeugen. Genauso vorstellbar ist jedoch auch der umgekehrte Weg, den Dienst als erstes zu implementieren und anschließend automatisch das WSDL Dokument erstellen zu lassen. Hierbei wird man durch diverse Tools unterstützt, wie zum Beispiel unter Axis und Java, wo die Tools WSDL2Java und Java2WSDL die automatische Erstellung der Klassen bzw. des WSDL Dokuments übernehmen. Eine 11 Kapitel 3: Die drei Haupttechnologien von Web Services weitere sehr nützliche Funktion von Axis ist die automatische Bereitstellung des WSDL Dokuments eines Dienstes, indem einfach ein „?wsdl“ an seine Adresse angehängt wird. Demnach ruft man das WSDL-Dokument des MyStockService aus Kapitel 2 unter http://localhost:8080/axis/services/MyStockService?wsdl ab und erhält folgendes Listing im Browser angezeigt: <?xml version="1.0" encoding="UTF-8" ?> <wsdl:definitions targetNamespace="http://localhost:8080/axis/services/MyStockService" xmlns:apachesoap=http://xml.apache.org/xml-soap xmlns:impl=http://localhost:8080/axis/services/MyStockService xmlns:intf=http://localhost:8080/axis/services/MyStockService xmlns:soapenc=http://schemas.xmlsoap.org/soap/encoding/ xmlns:wsdl=http://schemas.xmlsoap.org/wsdl/ xmlns:wsdlsoap=http://schemas.xmlsoap.org/wsdl/soap/ xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:message name="serviceStockResponse"> <wsdl:part name="serviceStockReturn" type="soapenc:string" /> </wsdl:message> <wsdl:message name="serviceStockRequest"> <wsdl:part name="arg" type="soapenc:string" /> </wsdl:message> <wsdl:portType name="MyStockService"> <wsdl:operation name="serviceStock" parameterOrder="arg"> <wsdl:input message="impl:serviceStockRequest" name="serviceStockRequest" /> <wsdl:output message="impl:serviceStockResponse" name="serviceStockResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="MyStockServiceSoapBinding" type="impl:MyStockService"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="serviceStock"> <wsdlsoap:operation soapAction="" /> <wsdl:input name="serviceStockRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://webservices.seminar" use="encoded" /> </wsdl:input> <wsdl:output name="serviceStockResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/services/MyStockService" use="encoded" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="MyStockServiceService"> <wsdl:port binding="impl:MyStockServiceSoapBinding" name="MyStockService"> <wsdlsoap:address location="http://localhost:8080/axis/services/MyStockService" /> </wsdl:port> </wsdl:service> </wsdl:definitions> Quelltext 8: WSDL Dokument von MyStockService 12 Kapitel 3: Die drei Haupttechnologien von Web Services Das erste Element <definition> hält das WSDL-Dokument zusammen und beinhaltet die globalen Deklarationen von Namensräumen, die im gesamten Dokument sichtbar sein sollen. Das Attribut targetNamespace definiert den Namensraum, den dieses Dokument erzeugt und ist ein eindeutiger Bezeichner für alle Typen oder abstrakten Definitionen aus dem Dokument. Dabei muss dieses Attribut auf eine absolute Referenz zeigen, praktisch ist hier die Adresse des aktuellen Dienstes verwendet. Dem <definition> Element folgen <import> Elemente (in diesem Beispiel nicht zu sehen), mit denen man Dokumente einbinden kann auf die Elemente einer Dienstedefinition verteilt sind. Hiermit möchte man eine Modularisierung und bessere Strukturierung von WSDL-Dokumenten ermöglichen. Dem folgt das <types> Element um eigene Datentypen zu definieren. Hier tauschen der Client und der Dienst nur den einfachen Datentyp String aus und damit entfällt eine eigene Datentypdeklaration. Die Beschreibung von Datentypen erfolgt mit XML Schema und ermöglicht somit die Definition von einfachen bis hin zu sehr komplexen Datentypen. Anschließend formuliert das <message> Element die Daten, die innerhalb des Web Service ausgetauscht werden. So wird jeweils für die Anfrage und Antwort ein String Datentyp und Name für das austauschende Argument deklariert. Es folgt das <portType> Element, dass eine Teilmenge von Operationen beschreibt. Das <operation> Element stellt eine Operation dar und entspricht hier der einzigen Java Methode, die der Web Service MyStockService zur Verfügung stellt. Analog zu einer Methodendefinition werden die eingehenden und ausgehenden Argumente beschrieben. Das <binding> Element schließlich bildet die abstrakte Definition eines <portType> Elements auf ein konkretes Protokoll ab. Es verwendet standardisierte Bindungserweiterungen wie HTTP, SOAP, MIME oder erzeugt eigene und bestimmt wie die Daten codiert werden sollen. Was jetzt noch fehlt ist die Bindung des Web Service an eine bestimmte URL. Dies erfolgt in der Regel am Ende eines WSDL-Dokuments mit dem <service> Element. 3.3 Universal Description, Discovery, and Integration (UDDI) Bei UDDI handelt es sich um eine standardisierte Methode zum Veröffentlichen und Auffinden von Informationen über Web Services. Es ist eine Industrie-Initiative, die sich zum Ziel gemacht hat, ein plattformunabhängiges, offenes Framework zu schaffen, in dem Unternehmen andere Unternehmen aufsuchen können, um 13 Kapitel 3: Die drei Haupttechnologien von Web Services Geschäftstransaktionen durchführen zu können. Die Informationen, die eine UDDIRegistrierungsstelle zur Verfügung stellt, kann man in drei verschiedene Arten einteilen: White Pages Grundlegende Kontaktinformationen über ein Unternehmen, darunter der Name, die Adresse, Ansprechpartner und eindeutige Bezeichner wie Handelsregisternummer. Mit diesen Informationen kann ein Web Service anhand der Firma gefunden werden. Yellow Pages Informationen, die ein Web Service mit verschiedenen Kategorien beschreiben. Dies ermöglicht das Auffinden von Diensten anhand seiner Zuordnung wie Rückversicherer, Maschinenbau etc. Green Pages Dort sind technische Informationen gebündelt, die das Verhalten eines Dienstes beschreiben, die ein Unternehmen betreibt. Hier findet man auch Informationen über Beziehungen innerhalb einer Gruppe von Web Services und wo die Dienste letztendlich zu finden sind. In der Zukunft wird eine Software vielleicht in der Lage sein, einen Dienst dynamisch und automatisiert finden zu können. Bis dahin wird man jedoch nur durch Fachwissen und manueller Suchtätigkeit, die ein entsprechender Business-Analyst mitbringt, Web Services finden und auswählen können. Die Suchtätigkeit mit UDDI ist aus Anwendersicht vergleichbar mit einer Internet-Suchmaschine für Gechäftsvorgänge. Diverse Portale wie www.xmethods.net stellen bereits Diensteverzeichnisse zur Verfügung. Automatisiert dagegen läuft schon jetzt das Bereitstellen und Aktualisieren von Daten in einer UDDI-Registrierungsstelle ab. Erstellt man einen Web Service, so sollte das verwendete Toolkit in der Lage sein die UDDI-Registrierungsstelle automatisiert zu kontaktieren und die Informationen bereitzustellen. Der Aufbau des UDDI-Projekts sieht eine UDDI Business Registry (UBR) vor, die so genannte Public Cloud (öffentliche Wolke), ein einziges System, das aus einer Reihe von Knoten besteht, deren Daten durch Replikation synchronisiert werden. Ein Operatorknoten sollte somit dieselben Informationen wie alle anderen bereitstellen. Fügt man neue Informationen zu einem Knoten hinzu, wird er für diese Daten der neue Hauptbesitzer und nur dort können die Daten aktualisiert und gelöscht werden. Jede Firma kann auch 14 Kapitel 3: Die drei Haupttechnologien von Web Services einen privaten Operatorknoten betreiben, der nicht zur UBR gehört und nicht mit der UBR synchronisiert werden muss. Diese privaten Operatorknoten können wiederum mit anderen privaten Knoten in Kontakt treten und eine private Wolke erzeugen. So können sich bestimmte Industriegruppen zusammenschließen und eigene Netze schaffen und ihre UDDI-Knoten ihren Bedürfnissen anpassen. Java unterstützt den Entwickler mit verschiedenen Arten bei dem Zugriff auf UDDIRegistrierungsstellen. Zum einem kann man sich eine Java-basierte SOAP-API zu Nutze machen, mit der man SOAP-Nachrichten erzeugt, die UDDI-XML-Dokumente enthalten. Diese sehr rudimentäre Möglichkeit bringt den Nachtteil mit sich, dass der Entwickler sehr viel Handarbeit an den Tag legen muss und die Reihenfolge, mit der eine UDDI-Registrierungsstelle die einzelnen SOAP-Nachrichten empfängt, genau kennen muss. Eine andere Variante ist das Verwenden einer speziellen Java-basierten UDDI-Client-API. Diese API bietet bereits spezielle Klassen und Konstrukte an, um von UDDI unterstützte Datenstrukturen und Nachrichten auszutauschen. Eine noch sich im frühen Entwicklungsstadium befindliche JAXR-Spezifikation hingegen definiert eine standardisierte Möglichkeit auf verschiedene Regierungsstellentypen zuzugreifen. Damit kann man auf einer höheren Abstraktionsschicht auch andere Stellen wie ebXML-Registry/Repository ansprechen und erreicht eine höhere Portabilität. Die UDDI-Spezifikation formuliert zwei APIs, die Inquiry-API und die Publishing-API. Abfragen lassen sich mit der Inquiry-API unverschlüsselt und anonym an eine UDDIStelle abschicken, währen die Publishing-API eine Authentifizierung verlangt, um Informationen zu erzeugen, zu speichern und zu aktualisieren. Darum sind diese zwei Dienste unter einer HTTP bzw. einer HTTPS Adresse zu erreichen. Um ein Beispiel für eine UDDI Stelle zu geben, hier Anfrage-URL und Veröffentlichungs-URL einer UDDI-Registrierungsstelle von SAP: http://udditest.sap.com/UDDI/api/inquiry und http://udditest.sap.com/UDDI/api/publish. Abschließend soll ein Entity-Diagramm (Abbildung 5) einen Überblick über die wichtigsten Datenstrukturen geben, die als Ein- und Ausgabeparameter von UDDINachrichten dienen: 15 Kapitel 4: Zusammenfassung <businessEntity> <publisherAssertion> grundlegende Informationen eines Unternehmens: - Name, Kontakt, Beschreibung - Bezeichner und Kategorien 1 n n n Beziehung zwischen zwei Firmen: - z.B. referenziert her ein Mutterkonzern seine Tochterfirma oder zwei Firmen agieren als Partner - damit eine Beziehung öffentlich sichtbar wird, müssen beide Seiten dieses Entity anlegen, erst dann ist eine Beziehung sozusagen genehmigt <businessService> einzelne, logische Diensteklassifikation: - Beschreibung einer Menge von Diensten, die ein Unternehmen anbietet 1 1 <bindingTemplate> - Zeiger auf technische Beschreibung - Zugriffspunkt-URL <tModel> 1 n abstrakte Beschreibung - einer Spezifikation - eines Verhaltens Abbildung 5: Datenstrukturen einer UDDI-Registrierungsstelle 4 Zusammenfassung Web Services umfassen die drei Haupttechnologien SOAP, WSDL und UDDI. Mit SOAP wird ein Kommunikationsprotokoll geschaffen, das eine plattformunabhängige Interaktion zwischen Client und Diensteanbieter ermöglicht. Es folgt keiner proprietären Norm und nutzt die Mächtigkeit, die XML bietet und mit der sich einfache bis zu sehr komplexen Nachrichten formulieren lassen. Ein WSDL-Dokument liefert eine abstrakte Schnittstellenbeschreibung aus der man entnehmen kann, was der Dienst macht, wie man ihn nutzt und wo man ihn findet. Um schließlich einen Web Service zu finden, fragt man bei einer UDDI-Registrierungsstelle nach. Diese bietet entsprechende Suchmöglichkeiten auf Informationen, die vorher von einem Diensteanbieter entweder manuell oder automatisiert durch das WS-Service-Toolkit eingepflegt wurden. Das Thema Web Services hat wie viele andere Informationstechniken einen Hype durchlebt, der mittlerweile etwas abgekühlt, aber dessen Entwicklung umso aktueller ist. Nicht zu unrecht bietet die Web Service Technologie viel potential, dessen Entwicklung am Anfang steht. Im Vergleich zu vorherigen Technologien wie z.B. CORBA entwickelt sich ein standardisiertes, plattformunabhängiges Interaktions- und 16 Kapitel 5: Literaturverzeichnis Austauschverfahren, das neue Konzepte wie UDDI-Registrierungsstellen einführt. UDDI-Registrierungsstellen sollen in Zukunft eine dynamische Interaktion zwischen Software ermöglichen, die selbständig Dienste suchen und in ihre Infrastruktur einbinden. Solch ein Ökosystem wird zu einer zunehmenden Verzahnung von Softwaresystemen und insbesondere im B2B Bereich zu neuen Geschäftsmodellen und transaktionen führen. 5 Literaturverzeichnis [ChJe03] David A. Chappell, Tyler Jewell: Java Web Services, O’Reilly, 2003. [Ray01] Erik T. Ray: Einführung in XML, O’Reilly, 2001. [Zi03] Olaf Zimmermann: Perspectives on Web Services, Springer, 2003. [Wa04] Dapeng Wang: Java Web Services mit Apache Axis, Software & Support Verlag, 2004. [Axis04] Apache Software Foundation: Axis Documentation, http://ws.apache.org/axis/java/index.html. 17