Themen Web Service - Clients Kommunikation zw. Web Services Stefan Szalowski Daten- und Online-Kommunikation Web Services Web Service Clients ● Bisher: ● Implementierung einer Java Anwendung und Bereitstellung durch Apache Axis unter Apache Tomcat – ● Erzeugen einer WSDL-Datei zur Service-Beschreibung und Erzeugen der implementierenden Klassen durch Apache Axis – – ● Java2WSDL WSDL2Java Die Grundlage, Web Services nutzen zu können, ist geschaffen Verwendung von Web Services in eigenen Anwendungen ● Stefan Szalowski Implementierung von Web Service Clients Daten- und Online-Kommunikation Web Services Web Service Clients ● Kommunikation zw. Client und Web Service ● Mittels SOAP-Nachrichten ● Über HTTP (auch andere Protokolle) ClientRechner ServerRechner ClientProgramm 1 Logische Kommunikation 10 ClientStub SOAPNachricht Stefan Szalowski Web Service Implementierung ServerSkeleton Tatsächliche Kommunikation mittels HTTP Daten- und Online-Kommunikation SOAPNachricht Web Services Web Service Clients ● Apache Axis – WSDL2Java ● Auflistung der von WSDL2Java erzeugten Klassen und Interfaces aus einer WSDL-Datei Quelle: http://ws.apache.org/axis/java/user-guide.html Stefan Szalowski Daten- und Online-Kommunikation Web Services Web Service Clients ● Beispiel: Web Service mit den Grundrechenarten – wsdl:types ● --> Java-Klassen Generell: pro Typ eine Klasse WSDL: <wsdl:types> <xsd:schema targetNamespace="http://www.example.org/MeinService/"> <xsd:element name="AdditionsParameter"> <xsd:complexType> <xsd:sequence> <xsd:element name="Zahl1" type="xsd:int"/> <xsd:element name="Zahl2" type="xsd:int"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="AdditionResultat" type="xsd:int"/> </xsd:schema> </wsdl:types> Stefan Szalowski Daten- und Online-Kommunikation Web Services Web Service Clients ● Beispiel: Web Service mit den Grundrechenarten – wsdl:types ● --> Java-Klassen Klassenname == type-Name (CodeConv werden eingehalten) Source: package org.example.www.MeinService; public class AdditionsParameter private int zahl1; private int zahl2; implements java.io.Serializable { public AdditionsParameter() { } public AdditionsParameter(int zahl1, int zahl2) { this.zahl1 = zahl1; this.zahl2 = zahl2; } public int getZahl1() { return zahl1; } public void setZahl1(int zahl1) { this.zahl1 = zahl1; } public int getZahl2() { return zahl2; } public void setZahl2(int zahl2) { this.zahl2 = zahl2; } } // weitere Methoden Stefan Szalowski Daten- und Online-Kommunikation Web Services Web Service Clients ● Beispiel: Web Service mit den Grundrechenarten – wsdl:types ● – --> Java-Klassen Klassenname == type-Name (CodeConv werden eingehalten) Besonderheit: ● ● ● Stefan Szalowski Ist ein wsdl:type-Element entweder inout- oder out-Parameter, so wird eine zusätzliche Holder-Klasse generiert Holder-Klassen dienen dem schreibenden Zugriff auf Parameter Für primitive Datentypen (auch für Strings) existieren bereits Holder-Klassen (siehe javax.xml.rpc.holders.Holder-Interface) Daten- und Online-Kommunikation Web Services Web Service Clients ● Beispiel: Web Service mit den Grundrechenarten – wsdl:portType ● --> Java-Interface (PortType) Service Definition Interface (SDI) WSDL: <wsdl:portType name="MeinService"> <wsdl:operation name="Addition"> <wsdl:input message="tns:AdditionRequest"/> <wsdl:output message="tns:AdditionResponse"/> </wsdl:operation> <wsdl:operation name="Multiplikation"> <wsdl:input message="tns:AdditionRequest"/> <wsdl:output message="tns:AdditionResponse"></wsdl:output> </wsdl:operation> </wsdl:portType> Source: package org.example.www.MeinService; public interface MeinService_PortType extends java.rmi.Remote { public int addition( org.example.www.MeinService.AdditionsParameter additionRequest) throws java.rmi.RemoteException; public int multiplikation( org.example.www.MeinService.AdditionsParameter additionRequest) throws java.rmi.RemoteException; } Stefan Szalowski Daten- und Online-Kommunikation Web Services Web Service Clients ● Beispiel: Web Service mit den Grundrechenarten – wsdl:binding Java-Klasse (Stub) ● Implementierung des Service Definition Interface (SDI) ● Stub-Klasse dient als Stellvertreter (Proxy) des Web Service – ● ● Stub-Objekt ist lokales Objekt auf der Client-Seite Erzeugt aus Methoden-Aufrufen auf einem Stub-Objekt SOAPNachrichten, die zum echten Web Service übertragen werden Stub-Objekte werden nicht vom Client selbst instanziert, sondern über Methodenaufruf des ServiceLocator (siehe nächste Folie) – Stefan Szalowski --> Wäre aber möglich Daten- und Online-Kommunikation Web Services Web Service Clients ● Beispiel: Web Service mit den Grundrechenarten – wsdl:binding ● Skelton-Objekt ist lokales Objekt auf der Server-Seite Dient Apache Axis als Stellvertreter-Klasse der Service Implementierung ● Requests an Axis werden an das Skeleton-Objekt weiter gegeben ● Skeleton ruft Methoden der Implementierenden Klasse auf – Stefan Szalowski Schnittstelle zw. Axis Web-Service-Implementierung Skeleton-Klasse dient als Stellvertreter (Proxy) des Web Service – ● Java-Klasse (Skeleton) Implementierung des Service Definition Interface (SDI) – ● --> Siehe nächste Folie (Java-Klasse (Impl)) Daten- und Online-Kommunikation Web Services Web Service Clients ● Beispiel: Web Service mit den Grundrechenarten – wsdl:binding ● --> Java-Klasse (Impl) Implementiert die Operationen des Web Service – addition(), multiplikation() Source: package org.example.www.MeinService; public class MeinServiceSOAP1Impl implements org.example.www.MeinService.MeinService_PortType{ public int addition(org.example.www.MeinService.AdditionsParameter additionRequest) throws java.rmi.RemoteException { return additionRequest.getZahl1() + additionRequest.getZahl2(); } public int multiplikation( org.example.www.MeinService.AdditionsParameter additionRequest) throws java.rmi.RemoteException { return additionRequest.getZahl1() * additionRequest.getZahl2(); } Stefan Szalowski Daten- und Online-Kommunikation Web Services Web Service Clients ● Beispiel: Web Service mit den Grundrechenarten – wsdl:service ● – --> Java-Klasse (ServiceLocator) Implementiert das o.g. Interface – Stefan Szalowski Java-Interface Definiert verschiedene getter-Methoden pro portType (Dienst) wsdl:service ● --> Wird auf Client-Seite verwendet, um Stub-Objekte zu instanzieren Daten- und Online-Kommunikation Web Services Web Service Clients ● Beispiel: Web Service mit den Grundrechenarten – Client aus generierten Klassen ● (Java Web Service) Request-Response-Client – – – Instanziere ServiceLocator-Objekt (sl) Hole Dir vom SL ein Stub-Objekt (s) Rufe die Operation (Methode) auf dem Stub-Objekt auf Source: package org.example.www.MeinService; import java.rmi.RemoteException; import javax.xml.rpc.ServiceException; public class ServiceClientWithSL { public static void main(String[] args) { MeinService_ServiceLocator sl = null; MeinService_PortType s = null; try { sl = new MeinService_ServiceLocator(); s = sl.getMeinServiceSOAP(); int response = s.addition(new AdditionsParameter(3,4)); System.out.println("Additions-Ergebnis: " + response); } // catch some Exceptions }} Stefan Szalowski Daten- und Online-Kommunikation Web Services Web Service Clients ● Beispiel: Web Service mit den Grundrechenarten – Client mittels javax.xml.rpc.*; ● Stefan Szalowski Folgt :o) Daten- und Online-Kommunikation Web Services