Webservices Grundlagen, Beispiel, Tomcat, Apache Axis JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 1 Was ist ein WebService Eine oder mehrere Methoden die über das Netzwerk aufgerufen werden können. Standardisierter Remote Procedure Call (RPC) Parameter und Rückgabewerte werden serialisiert. Nachrichtenbasiert XML Sprachunabhängig • Java, .Net, Perl, ... Vorteile Nachteile • Zentralisierung • Zentralisierung - Wartbarkeit - Verfügbarkeit • Systemunabhängigkeit • Standardisiert • Entkopplung der Logik und der Darstellung • Aufwand • Authentifizierung JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 2 Aufruf eines WebServices Anwendung nutzt WebService Stub, sie kümmert sich nicht darum woher der Stub das Ergebnis hat. WebService Stub verpackt die Anforderung in XML und schickt sie dem Webserver Webserver (z.B.: Tomcat mit AXIS) erkennt die Anfrage und ruft das entsprechende WebService auf (Reflection) Webserver verpackt die Antwort in XML und schickt sie an den Stub Stub entpackt die Antwort und liefert das Ergebnis. Transportschicht Anwendung Webserver WebService Stub WebService Implementierung JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 3 XML XML ist: • • • • • • Extensible Markup Language Inspiriert durch SGML Einfach, flexibel, Textformat Portabel DTD, XML-Schema (XSD) http://www.w3.org/XML/ XML is a markup language, and only a markup language. It's important to remember this fact. The XML hype has become so extreme that some people expect XML to do everything up to, and including, washing the family dog. XML In A Nutshell, Eliotte Rusty Harold & W. Scott Means XML ist nicht: • Programmiersprache • Netzwerkprotokoll • Datenbank JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 4 WSDL Web Service Description Language Standard zur Beschreibung von Netzwerkdiensten • Service - Adresse - Name • Funktionen - Name - Parameter - Rückgabewert • Typen - Beschreibung der verwendeten Typen in den Nachrichten • Nachrichten - Aufbau der möglichen Nachrichten Plattformunabhängig Programmiersprachenunabhängig XML http://www.w3.org/TR/wsdl.html JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 5 SOAP Simple Object Access Protocol Ziele: • Einfach • Erweiterbar • Leichtgewichtig Repräsentation: XML Standardisiertes Verpackungsprotokoll für Nachrichtenaustausch Entwickelt von: • • • • Microsoft IBM DevelopMentor (Don Box) UserLand (Dave Winer) Seit 2000 W3C Spezifikation (http://www.w3.org/TR/SOAP/) Implementierungen: • Apache Axis (früher Apache SOAP) • Microsoft .NET JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 6 Beispiel SOAP Nachricht (Anfrage) POST /axis/services/Test HTTP/1.0 ContentContent-Type: text/xml; charset=utfcharset=utf-8 Header UserUser-Agent: Axis/1.1 (HTTP & SOAP) Host: localhost SOAPAction: "" ContentContent-Length: 368 ... <?xml version="1.0" encoding="UTFencoding="UTF-8"?> <soapenv:Envelope SOAP Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchemaxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> SOAP Body test <ns1:test <ns1: <ns1:test <ns1:test soapenv:encodingStyle= soapenv:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/" "http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="TestPack xmlns:ns1=" TestPack"/> "/> xmlns:ns1="TestPack TestPack"/> "/> xmlns:ns1=" TestPack TestPack </soapenv:Body> </soapenv:Envelope> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 7 Beispiel SOAP Nachricht (Antwort) HTTP/1.1 200 OK ContentContent-Type: text/xml;charset=utftext/xml;charset=utf-8 Header Date: Thu, 29 Jan 2004 07:04:44 GMT (HTTP & SOAP) Server: ApacheApache-Coyote/1.1 Connection: close ... <?xml version="1.0" encoding="UTFencoding="UTF-8"?> <soapenv:Envelope SOAP Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema<soapenv:Body> <soapenv:Body> SOAP Body <ns1:testResponse <ns1:testResponse soapenv:encodingStyle= soapenv:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/" "http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="TestPack"> xmlns:ns1="TestPack"> <testReturn xsi:type="xsd:string">Test</testReturn> <testReturn xsi:type="xsd:string">Test</testReturn> </ns1:testResponse> </ns1:testResponse> </soapenv:Body> </soapenv:Body> </soapenv:Envelope> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 8 WebServices in Java Application Server • • • • Apache Tomcat Bea Weblogic IBM WebSphere ... SOAP Implementierung • • • • Apache AXIS IBM Web Service Toolkit Graham Glass GLUE ... Axis Servlet1 Servlet2 Tomcat JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 9 Erstellen eines SOAP Beispiels Service • Schnittstelle: "Test.java" package TestPack; public interface Test { public String test(); } • oder "dummy"-Implementierung: "Test.java" package TestPack; public class Test { public String test() { return ""; } } JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 10 Erstellen eines SOAP Beispiels Erstellen der WSDL • java org.apache.axis.wsdl.Java2WSDL [optionen] Klasse - --output <Name der Zieldatei> --location <URL des Services> --namespace <Ziel Namesraum> ... java org.apache.axis.wsdl.Java2WSDL --output "Test.wsdl" --location "http://localhost:8080/axis/services/Test" TestPack.Test xy.java javac xy.class Java2WSDL xy.wsdl JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 11 Erstellen eines SOAP Beispiels Erstellen der Stubs • java org.apache.axis.wsdl.WSDL2Java [Optionen] WSDL-URI - --server-side - --skeletonDeploy <true | false> - --output <Zielverzeichnis> java org.apache.axis.wsdl.WSDL2Java --server-side --skeletonDeploy true --output . Test.wsdl xy.wsdl WSDL2Java Serverseitige Dateien: xy.java, xySoapBindingImpl.java, xySoapBindingSkeleton.java Dateien für deploy/undeploy: deploy.wsdd, undeploy.wsdd Clientseitige Dateien: xyService.java, xyServiceLocator.java xySoapBindingStub.java JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 12 Erstellen eines SOAP Beispiels Achtung "xy.java" überschreibt das Original package TestPack; public interface Test { public String test(); } /** * Test.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package TestPack; public interface Test extends java.rmi.Remote { public java.lang.String test() throws java.rmi.RemoteException; } JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 13 Erstellen eines SOAP Beispiels Implementierung in xySoapBindingImpl.java /** * TestSoapBindingImpl.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package TestPack; public class TestSoapBindingImpl implements TestPack.Test{ public java.lang.String test() throws java.rmi.RemoteException { return null; return "Test"; } } JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 14 Erstellen eines SOAP Beispiels Kompilieren der java Dateien Kopieren von • xy.class • xySoapBindingImpl.class • xySoapBindingSkeleton.class nach "%CATALINA_HOME%\webapps\axis\WEB-INF\classes\<Namensraum>" JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 15 Erstellen eines SOAP Beispiels Installieren eines Webservices (deploy) • java org.apache.axis.client.AdminClient <Deployment Descriptor> java org.apache.axis.client.AdminClient deploy.wsdd <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="Test" provider="java:RPC" style="rpc" use="encoded"> <parameter name="wsdlTargetNamespace" value="TestPack"/> <parameter name="wsdlServiceElement" value="TestService"/> <parameter name="wsdlServicePort" value="Test"/> <parameter name="className" value="TestPack.TestSoapBindingSkeleton"/> <parameter name="wsdlPortType" value="Test"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 16 Erstellen eines SOAP Beispiels Anzeigen installierter Services (list): java org.apache.axis.client.AdminClient list Komfortabler über http://localhost:8080/axis/services Entfernen (undeploy): java org.apache.axis.client.AdminClient undeploy.wsdd <undeployment xmlns="http://xml.apache.org/axis/wsdd/"> <service name="Test"/> </undeployment> JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 17 Erstellen eines SOAP Beispiels Client: import import import import TestPack.Test; TestPack.TestServiceLocator; javax.xml.rpc.ServiceException; java.rmi.RemoteException; public class Client { public static void main(String args[]) throws ServiceException, RemoteException { Test t; TestServiceLocator locator; locator = new TestServiceLocator(); t = locator.getTest(); System.out.println(t.test()); } } JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 18 Ablauf Client: org.apache.axis.client.Call org.apache.axis.client.Stub java.rmi.Remote invoke() TestPack.Test TestPack.TestSoapBindingStub org.apache.axis.client.Service TestPack.TestService test() TestPack.TestServiceLocator Client getTest() JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 19 Ablauf Server: org.apache.axis.wsdl.Skeleton java.rmi.Remote TestPack.Test TestPack.TestSoapBindingImpl test() TestPack.TestSoapBindingSkeleton test() Axis Tomcat JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 20 Überwachen der Client/Server-Kommunikation java org.apache.axis.utils.tcpmon [List. Port] [Targ. Host] [Targ. Port] Anfrage Antwort JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 21 WebService mit .Net TestService.asmx: <%@ WebService Language="C#" Class="TestService"%> using System.Web.Services; public class TestService : WebService { [WebMethod] public string GetTest() { return "Test"; } } Virtuelles Verzeichnis im IIS anlegen, TestService.asmx ablegen WSDL: .../TestService.asmx?WSDL Testseite: .../TestService.asmx?op=GetTest JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 22 Zusammenfassung Sprachunabhängig • Java • .NET (C#) XML Zentralisiert • Wartbar • Verfügbarkeit Logik und Darstellung entkoppelt JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 23 Tomcat 5 Voraussetzungen: • Java SDK Version >= 1.3 • Umgebungsvariablen - JAVA_HOME=C:\j2sdk1.4.2_02 - CATALINA_HOME=C:\Webservices\jakarta-tomcat-5.0.16 Download: http://apache.netmonic.com/jakarta/tomcat-5/ Starten: startup - CATALINA_HOME\bin\startup.bat - Linux: CATALINA_HOME/bin/startup.sh Betrieb: http://localhost:8080/ Stoppen: shutdown - Windows: CATALINA_HOME\bin\shutdown.bat - Linux: CATALINA_HOME/bin/shutdown.sh JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 24 Apache AXIS 1.1 Voraussetzungen: • • Java SDK Version >= 1.4 Servlet Container (z.B.: Tomcat) - http://jakarta.apache.org/tomcat/ • JavaBeans Activation Framework - http://java.sun.com/products/javabeans/glasgow/jaf.html Download: http://ws.apache.org/axis/ Entpacken Kopieren • • ??\Axis-1_1\webapps\axis -> CATALINA_HOME\webapps\ ??\jaf-1.0.2\activation.jar -> CATALINA_HOME\common\lib\ Umgebungsvariablen • • • • AXIS_HOME=c:\Webservices\axis-1_1 AXIS_LIB=%AXIS_HOME%\lib AXISCLASSPATH=%AXIS_LIB%\axis.jar;%AXIS_LIB%\commonsdiscovery.jar;%AXIS_LIB%\commonslogging.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j1.2.8.jar CLASSPATH=%CLASSPATH%;%AXISCLASSPATH% JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 25 Testen der Installation http://localhost:8080/axis/happyaxis.jsp JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 26