AVID Übung 4 - Verteilte Systeme

Werbung
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
Herunterladen