AVID Übung 4 Webservices mit Apache Axis Andreas I. Schmied (schmied@inf...) Abteilung Verteilte Systeme Universität Ulm SS2005 Grundlagen Und nun. . . 1 Grundlagen Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 2 / 56 Grundlagen Grundlagen Apache eXtensible Interaction System SOAP Engine für Client, Server, Gateways Axis implementiert JAX-RPC aus jaxrpc.jar, saaj.jar als Standalone Server verfügbar als WebApp in Servlet-Engine: axis.war Drop-In Deployment Instant Deployment .java-Datei nach .jws umbenennen ohne Packages, ohne Deployment/Typemapping, ... zukünftig vielleicht via Annotations in WebApp-Verzeichnis kopieren Axis compiliert und installiert automatisch Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 3 / 56 Grundlagen Grundlagen – Einfacher Client 1 2 3 4 5 6 7 import org.apache.axis.client.Call; import org.apache.axis.client.Service; import javax.xml.namespace.QName; ... String endpoint = ”http://ws.apache.org:5049/axis/services/echo”; Service service = new Service(); Call call = (Call) service.createCall(); 8 9 10 call.setTargetEndpointAddress( new java.net.URL(endpoint) ); call.setOperationName(new QName(”http://soapinterop.org/”, ”echoString”)); 11 12 13 14 15 call.addParameter (”testParam”, org.apache.axis.Constants.XSD STRING, javax.xml.rpc.ParameterMode.IN); call.setReturnType(org.apache.axis.Constants.XSD STRING); // alternativ: call.setReturnClass(String.class); 16 17 18 String ret = (String) call.invoke( new Object[] { ”Hello!” } ); 19 20 System.out.println(”Sent ’Hello!’, got ’” + ret + ”’”); Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 5 / 56 Grundlagen Grundlagen – Einfacher Client Dynamic Invocation Alternative: generierte Stubs (s.u.) Endpunkt hier Axis-Servlet (/axis/...) innerhalb Servlet-Container QName: Name der Operation durch Namespace-URI qualifiziert addParameter/setReturnType sind ggf. optional, erlauben strikte Typisierung setReturnClass mit implizitem Typemapping auf XSD/SOAP-Typ Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 6 / 56 Grundlagen Grundlagen – Request-Nachricht 1 2 3 4 POST /axis/test HTTP/1.0 ... Content−Type: text/xml; charset=utf−8 SOAPAction: ”” 5 6 7 8 <soap:Envelope xmlns:xsd=”http://www.w3.org/2001/XMLSchema” xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope/” xmlns:xsi=”http://www.w3.org/2001/XMLSchema−instance”> 9 10 <soap:Body> 11 12 13 14 <ns1:echoString xmlns:ns1=”http://soapinterop.org/”> <testParam xsi:type=”xsd:string”>Hello!</testParam> </ns1:echoString> 15 16 17 </soap:Body> </soap:Envelope> Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 8 / 56 Grundlagen Grundlagen – Reply-Nachricht 1 2 3 4 5 HTTP/1.0 200 OK ... <soap:Envelope xmlns:xsd=”http://www.w3.org/2001/XMLSchema” xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope/” xmlns:xsi=”http://www.w3.org/2001/XMLSchema−instance”> 6 7 <soap:Body> 8 9 10 11 <ns1:echoStringResponse xmlns:ns1=”http://soapinterop.org/”> <result xsi:type=”xsd:string”>Hello!</result> </ns1:echoStringResponse> 12 13 14 </soap:Body> </soap:Envelope> Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 10 / 56 Grundlagen Grundlagen – Debugging mit TCPMonitor (1) starten mit java −cp lib/axis.jar org.apache.axis.utils.tcpmon lokaler Port >1024 Target ist Axis/Tomcat-Server Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 12 / 56 Grundlagen Grundlagen – Debugging mit TCPMonitor (2) Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 14 / 56 Architektur Und nun. . . 2 Architektur Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 15 / 56 Architektur Architektur – Nachrichtenfluss (1) Chains of Handlers“ ” Chains sind selber Handlers Clientseite (Bild aus Axis Architecture Guide) Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 16 / 56 Architektur Architektur – Nachrichtenfluss (2) Serverseite (Bild aus Axis Architecture Guide) Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 17 / 56 Architektur Architektur – Verarbeitung von Nachrichten MessageContext in Handlerkette durchgereicht enthält Request, Response, Properties erzeugt durch TransportListener im Server oder Client-API Ablauf im Server TransportListener erhält Anfrage erzeugt MessageContext MC und wählt Transport Object TO übergibt MC der Request Chain des TO danach durch Handlers der Global Chain GC ein Handler hat Property serviceHandler gesetzt Property bestimmt Service Chain SC z.B. SOAPService SC bearbeitet MC bis zum Service Provider danach Rückfluss durch Response-Handlers Pivot Point: Handler, der Req/Res-Umkehr auslöst, AKA Provider Ablauf im Client analog in umgekehrter Reihung: SC→GC→TC Fehlerbehandlung: onFault() wird rückwärts die Chains entlang bearbeitet Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 18 / 56 Architektur Architektur – Subsysteme modularer Aufbau (teils nur konzeptionell) Axis-Kern: message flow“ ” orthogonale aber kooperierende Teilsysteme (Bild aus Axis Architecture Guide) Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 19 / 56 Deployment Und nun. . . 3 Deployment Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 20 / 56 Deployment Deployment WSDD-Descriptoren für Deployment und Undeployment Dienste Zugriffsbeschränkung Methodenbeschränkung Lebenszeit (Scope vgl. Servlets) Werkzeug: AdminClient (Un-)Deployment 1 java −cp lib/axis.jar org.apache.axis.client.AdminClient (un)deploy.wsdd Liste der bekannten Dienste 1 java −cp lib/axis.jar org.apache.axis.client.AdminClient list Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 22 / 56 Deployment Deployment – Deployment Descriptor 1 2 <deployment xmlns=”http://xml.apache.org/axis/wsdd/” xmlns:java=”http://xml.apache.org/axis/wsdd/providers/java”> 3 4 5 6 <handler name=”track” type=”java:samples.userguide.example4.LogHandler”> <parameter ... </handler> 7 8 <service name=”MyService” provider=”java:RPC”> 9 10 11 12 <parameter name=”className” value=”samples.userguide.example3.MyService”/> <parameter name=”allowedMethods” value=”∗”/> <parameter name=”scope” value=”application” /> ... session, request 13 14 15 16 <requestFlow> <handler type=”track”/> </requestFlow> 17 18 19 </service> </deployment> Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 24 / 56 Service Stile Und nun. . . 4 Service Stile Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 25 / 56 Service Stile Service Stile (1) unterschiedliche Parameterbehandlung RPC: SOAP-Encoding, XML-Java-Binding Document: nur XML-Java-Binding, Deserialisierung des XML-Objekts unter <soap:Body> als ein Parameter Wrapped: wie Document, aber Deserialisierung der Elemente des XML-Objekts in individuelle Parameter Message: beliebiger XML-Inhalt ohne Java-Binding RPC-Services <service style=”RPC” ...> oder <service provider=”java:RPC” ...> Serialisierung inkl. Multi-Ref“ Objektgraphen ” Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 27 / 56 Service Stile Service Stile (2) Document 1 2 class Student { int matrikel; String name; ... } ...method(Student stud); Wrapped 1 ...method(int matrikel, String name, ...); Message-Services 4 mögliche Signaturen 1 2 3 4 public Element [] method(Element [] bodies); public SOAPBodyElement [] method (SOAPBodyElement [] bodies); public Document method(Document body); public void method(SOAPEnvelope req, SOAPEnvelope resp); Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 29 / 56 Type-Mapping Und nun. . . 5 Type-Mapping Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 30 / 56 Type-Mapping Type-Mapping Abbildung fundamentaler Datentypen Java→XML-Schema Auszug: xsd:string – java.lang.String xsd:float/int/boolean/byte – float/int/boolean/byte xsd:integer – java.math.BigInteger xsd:base64Binary – byte[] xsd:dateTime – java.util.Calendar xsd:QName – javax.xml.namespace.QName Fehlerquellen für Multirefs werden spezielle SOAP-Ersatztypen bereitgestellt (mit ID/HREF-Attributen) HashMaps sind u.U. nicht interoperabel → auf Arrays abbilden Anmelden von eigenem oder BeanSerializer für beliebige Typen Remote-Referenzen nicht zulässig! Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 31 / 56 Type-Mapping Type-Mapping – Bean Serializer Spezialform des allgemeinen Type-Mappings org.apache.axis.encoding.ser.Bean(De)SerializerFactory generischer Serializer/Deserializer für Java Beans Zugriff via Setter/Getter Deklaration für eigene Typen mit 1 2 <beanMapping qname=”ns:MappedName” xmlns:ns=”someNamespace” languageSpecificType=”java:my.java.Classname”/> Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 33 / 56 Type-Mapping Type-Mapping – Array Serializer Deklaration 1 2 3 4 <arrayMapping qname=”ns:ArrayOfClassname” xmlns:ns=”someNamespaceURI” languageSpecificType=”java:my.java.Classname[]” innerType=”ns2:Classname” xmlns:ns2=”innerNameSpaceURI” encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”/> Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 35 / 56 Type-Mapping Type-Mapping – Custom Serializer Deklaration 1 2 3 4 5 <typeMapping qname=”ns:local” xmlns:ns=”someNamespace” languageSpecificType=”java:my.java.Classname” serializer=”my.java.SerializerFactory” deserializer=”my.java.DeserializerFactory” encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”/> Factories erzeugen Instanz von javax.xml.rpc.encoding.(De)Serializer (De)Serializer schreibt(liest) XML-Daten 1 2 3 ... void serialize(QName name, Attributes attributes, Object value, SerializationContext context) { 4 MyType data = (MyType) value; context.startElement(name, attributes); context.serialize(new QName(””, ”field”), null, data.primitiveData); context.endElement(); 5 6 7 8 9 } Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 37 / 56 Type-Mapping Type-Mapping – Client-Konfiguration programmatisch, falls keine generierten Stubs an Call-Objekt: 1 2 Call c; ... QName qn = new QName(”urn:avid”, ”calendar”); 3 4 5 6 7 8 9 c.registerTypeMapping(CalendarBean.class, qn, new org.apache.axis.encoding.ser... ...BeanSerializerFactory(CalendarBean.class, qn), new org.apache.axis.encoding.ser... ...BeanDeserializerFactory(CalendarBean.class, qn) ); Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 39 / 56 WSDL-Integration Und nun. . . 6 WSDL-Integration Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 40 / 56 WSDL-Integration WSDL-Integration – Werkzeuge WSDL-Descriptoren generierbar aus laufenden Diensten WSDL-Java-Mapping: Proxies, Hilfsklassen 1 2 java org.apache.axis.wsdl.WSDL2Java <filename.wsdl> java org.apache.axis.wsdl.WSDL2Java −−server−side [−−skeletonDeploy true] <filena Interface pro <portType> mit Methoden pro <operation> Stub-Klasse pro <binding> (intern Service/Call-Objekte) Service-Locator pro <service> (erzeugt Stubs) ggf. (un)deploy.wsdd Java-WSDL-Mapping 1 2 3 4 java org.apache.axis.wsdl.Java2WSDL −o wp.wsdl −l”http://localhost:8080/axis/services/WidgetPrice” −n ”urn:Example6” −p”samples.userguide.example6” ”urn:Example6” samples.userguide.example6.WidgetPrice ANT-Tasks für beide Richtungen verfügbar WSDL-Datei generieren lassen: 1 http://my.server:8080/axis/services/MyService?wsdl Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 42 / 56 WSDL-Integration WSDL-Integration – Benutzung Locator kapselt Verbindung zu Standard-URL optional andere URL als Parameter Locator erzeugt Stub mit Verbindung zu Dienst 1 2 3 4 MyServiceLocator loc = new MyServiceLocator(); MyService srv = loc.getServiceName(); // optional: URL−Parameter srv.doSomething(); Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 44 / 56 EJB-Anbindung Und nun. . . 7 EJB-Anbindung Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 45 / 56 EJB-Anbindung EJB-Anbindung Stateless Session Bean als Webservice Deployment 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... <service name=”CalendarDetails” provider=”java:EJB”> <parameter name=”beanJndiName” value=”jndi.Calendar” /> <parameter name=”homeInterfaceName” value=”CalendarHome” /> <parameter name=”remoteInterfaceName” value=”Calendar” /> <parameter name=”allowedMethods” value=”getEntries” /> <parameter name=”className” value=”CalendarBean” /> ... // z.B. JNDI−Serveradresse <typeMapping xmlns:ns=”urn:avid” qname=”ns:CalendarBean” type=”java:avid.u4.CalendarBean” serializer=”org.apache.axis.encoding.ser.BeanSerializerFactory” deserializer=”org.apache.axis.encoding.ser.BeanDeserializerFactory” encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”/> </service> Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 47 / 56 Beispiel Google Und nun. . . 8 Beispiel Google Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 48 / 56 Beispiel Google Beispiel Google (1) Umfangreiches API-Paket (siehe letzte Folie) Anmeldung erforderlich (kostenlos) Zugriff per Google-API: 1 GoogleSearch s = new GoogleSearch(); 2 3 4 s.setKey(clientKey); s.setQueryString(directiveArg); 5 6 GoogleSearchResult r = s.doSearch(); 7 8 9 10 11 System.out.println(r.toString()); // oder GoogleSearchResultElement[] res = r.getResultElements(); Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 50 / 56 Beispiel Google Beispiel Google (2) Zugriff per WSDL2Java: 1 2 GoogleSearchService gssl = new GoogleSearchServiceLocator(); 3 4 5 URL url = new URL( ”http://api.google.com:80/search/beta2”); 6 7 8 GoogleSearchPort gsp = gssl.getGoogleSearchPort(url); 9 10 11 12 13 GoogleSearchResult sr = gsp.doGoogleSearch ( myRegKey, q, start, maxResults, filter, restrict, safeSearch, lr, ie, oe); 14 15 ResultElement[] res = sr.getResultElements(); 16 17 System.out.println(res[0].getURL()); ... Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 52 / 56 Aufgabe Und nun. . . 9 Aufgabe Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 53 / 56 Aufgabe Aufgabe Installation à la Tomcat trivial eigene Recherche rollenbasierte, deklarative Authorisierung in Axis siehe: users.lst, perms.lst eigener Webservice Auflistung der Kalendereinträge ggf. gefiltert durch Datumsangabe Zugriff auf Google-API kleines Konsolen-Tool Ausgabe der Abstracts der Ergebnisse ... Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 54 / 56 Material Und nun. . . 10 Material Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 55 / 56 Material Material http://www.google.com/apis http://www.soapclient.com/uddisearch.html http://www.xmethods.net http://ws.apache.org/axis beinhaltet User/Architecture-Guides und Beispiele http://directory.google.com/Top/Computers/ Programming/Internet/Service-Oriented_ Architecture/Web_Services/ http: //www.dmoz.org/Computers/Programming/Internet/ Service-Oriented_Architecture/Web_Services/ http://xfire.codehaus.org JSR 181: Web Service Metadata Andreas I. Schmied (schmied@inf...) AVID Übung 4 SS2005 56 / 56