Web Services SYSTEM SOFTWARE 1 Web Services Einführung Web-Services in Java JAXB SOAP und WSDL Zusammenfassung SYSTEM SOFTWARE 2 Motivation Integration heterogener, verteilter Systeme global verteilt unterschiedliche Programmiersprachen unterschiedliche APIs B2C und B2B Anwendungen Nutzung global verteilter Services Beispiel: Travel Agent Service entnommen aus: Web Services Architecture Usage Scenarios, W3C Working Group Note, 11 February 2004, http://www.w3.org/TR/2004/NOTE-ws-arch-scenarios20040211/ SYSTEM SOFTWARE 3 Was sind Web Services? Middleware for verteilte Anwendungen Für Remote Procedure Calls (SOAP) und Dokumenten-basierten Zugriff (RESTful) Offener Standard basierend auf XML Für lose gekoppelte Software-Services Unabhängig von Programmiersprachen und Betriebssystemen Mit Verwendung von existierenden Internet-Protokollen und ServerArchitekturen SYSTEM SOFTWARE 4 Definition Web-Service (nach W3C) durch eine URI identifizierbare Softwareanwendung mit Schnittstellendefinition in XML mit Interaktion auf Basis XML-basierter Nachrichten und Nachrichtenaustausch über Internetprotokolle SYSTEM SOFTWARE 5 Unabhängigkeit und Integration durch ... SOAP XML-Standard für Nachrichtenaustausch unabhängig von Transportprotokoll unabhängig von Client- und Service-Implementierung: Java, .NET, Python, … Web Services Description Language - WSDL (1.1) Interface-Beschreibung in XML Kommunikation auf Basis existierenden Protokolle und Serverarchitekturen HTTP und Web-Server SMTP und Mail-Server FTP und FTP-Server Standardisierung (W3C) SOAP 1.2, WSDL 2.0 Zusätzliche Protokolle basierend auf SOAP and WSDL Bindung an Protokollschicht (HTTP) SYSTEM SOFTWARE 6 Web-Service-Infrastruktur Web Container WSDL – Web Service Description Language beschreibt WebServiceSchnittstelle mit XML Web Service Program Stubs Ties Erlaubt Generierung der Stubs für unterschiedliche Plattformen wsimport WSDL JAX-WS Runtime Web Container SOAP Remote Procedure Calls mit XML-Serialisierung Client Program Web Service Program Stubs Ties JAX-WS Runtime SYSTEM SOFTWARE SOAP JAX-WS Runtime 7 Web-Services im Vergleich Java RMI .NET Remoting CORBA Web-Services Programmiersprache Java .NET Sprachen (C#, VB.NET, ..) unabhängig unabhängig Schnittstellendefinition Java Interfaces .NET Interfaces CORBA IDL WSDL (XMLbasiert) Datenstrukturen Java Objekte .NET Objekte IDL-spezifizierte Objekte XML-Daten Übertragungsprotokoll RMI-IIOP binär oder SOAP GIOP/IIOP HTTP, HTTPS, SMTP, FTP Verpackung Java ObjektSerialisierung .NET ObjektSerialisierung ORB/CDR SOAP Infrastruktur Java RMIInfrastruktur .NET RemotingInfrastruktur ORBs Web-, Mail-, FTPServer SYSTEM SOFTWARE 8 Vor- und Nachteile Vorteile unabhängig von Programmiersprache, Laufzeitumgebung und Betriebssystem baut auf bestehender Internet-Infrastruktur auf standardisiert Nachteile Performance (XML) keine wirklichen Objektkommunikation wie bei RMI SYSTEM SOFTWARE 9 Web Services Einführung Web-Services in Java JAXB SOAP und WSDL Zusammenfassung SYSTEM SOFTWARE 10 Web Service Implementierung in Java (1 / 4) Package javax.jws Implementierung einer Service-Klasse package personservice; ... import javax.jws.WebMethod; import javax.jws.WebService; Annotation der Klasse als WebService @WebService public class PersonManager { private Map<Long, Person> persons; public PersonManager() { … } Parameterloser Konstruktor Annotation der Methoden als WebMethod @WebMethod public String getPersonName(long ssn) { return persons.get(ssn).getName(); } … } SYSTEM SOFTWARE 11 Web Service Implementierung in Java (2 / 4) Generierung der Stub-Klassen mit wsgen Verzeichnis mit class-Files Aus den class-Files werden Klassen für die Serialisierung der Requests und Responses in XML erzeugt JAXB Serialisierung! Unterverzeichnis .jaxws package personservice.jaxws; … @XmlRootElement(name = "getPersonName", namespace = "http://personservice/") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "getPersonName", namespace = "http://personservice/") public class GetPersonName { } package personservice.jaxws; ... @XmlRootElement(name = "getPersonNameResponse", namespace = "http://personservice/") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "getPersonNameResponse", namespace = "http://personservice/") public class GetPersonNameResponse { @XmlElement(name = "arg0", namespace = "") private long arg0; @XmlElement(name = "return", namespace = "") private String _return; public long getArg0() { return this.arg0; } public String getReturn() { return this._return; } public void setArg0(long arg0) { this.arg0 = arg0; } public void setReturn(String _return) { this._return = _return; } } SYSTEM SOFTWARE 12 Web Service Implementierung in Java (3 / 4) Starten des Servers und Publikation des Web Service mit Endpoint package personservice; import javax.xml.ws.Endpoint; public class PersonSerciceStart { public static void main(String[] args) { Endpoint ep = Endpoint.publish("http://localhost:8080/WebServices/personservice", new PersonManager()); ... ep.stop(); } } SYSTEM SOFTWARE 13 Web Service Implementierung in Java (4 / 4) Web Service muss laufen! Abrufen der WSDL Interface Beschreibung Abrufen der XML-Schemabeschreibungen SYSTEM SOFTWARE 14 Web Service Client Implementierung eines Clients: Generierung der Stub-Klassen für Client aus WSDL WSDL vom Web Server Requests und Responses Marshalling Datenobjekte Object Factory Interface für Web Service Factory for Web Service Implementierung des Clients unter Verwendung der generierten Stub-Klassen package personservice.client; import personservice.server.*; public class PersonServiceClient { public static void main(String[] args) { PersonManagerService service = new PersonManagerService(); PersonManager port = service.getPersonManagerPort(); Erzeugen des Web Service Schnittstelle zu Web Service String franzName = port.getPersonName(8512031111L); System.out.println(franzName); } } SYSTEM SOFTWARE 15 Web Services Einführung Web-Services in Java JAXB SOAP und WSDL Zusammenfassung SYSTEM SOFTWARE 16 Java Architecture for XML Binding (JAXB 2.0) Daten werden bei Java Web Services mit JAXB kodiert! Bindet Objektzustände an XMLDokumente Mit Annotationen Abbildung durch Schema oder Annotationen festlegbar Klassen aus Schema oder Schema aus Klassen generieren Automatisches Serialisieren ganzer Objektbäume SYSTEM SOFTWARE 17 JAXB 2.0 – API: wichtige Annotationen Namespaces javax.xml.bind javax.xml.bind.annotation Annotationen: @XmlRootElement Klassen, Enums Abbildung auf XML-Elemente @XmlType Klassen, Enums Definition von XML-Complex Types @XmlEnum und @XmlEnumValue Enums Abbilding auf String-Werte @XmlElement Properties, Felder Abbildung auf XML-Elemente @XmlAttribute Properties, Felder Abbilding auf XML-Attribute @XmlAdapter Properties, Felder Anpassung der Abbildung bestimmter Properties SYSTEM SOFTWARE 18 JAXB – Java Architecture for XML Binding Kodierung von wichtigen Java-Datentypen SYSTEM SOFTWARE 19 Annotierung von JavaBeans JavaBean = Klasse nach bestimmtem Schema • Properties • parameterloser Konstruktor XML-Serialisierung von JavaBeans Annotation der Klasse mit @XmlType Annotation der Getter-Methoden oder Felder mit @XmlElement: Serialisierung als XMl-Element @XmlAttribute : Serialisierung als XML-Attribut @WebService public class PersonManager { ... JAXB-Binding von Person notwendig @XmlType public class Person { private long ssn; private String name; public Person() { @WebMethod public Person getPerson(long ssn) { return persons.get(ssn); } } @XmlAttribute public long getSSN() { return ssn; } @WebMethod public void addPerson(Person p) { persons.put(p.getSSN(), p); } } Parameterloser Konstruktor Properties @XmlElement public String getName() { return name; } } SYSTEM SOFTWARE 20 Xml-Serialisierung: Enumerationen @XmlType einfache Serialisierung von Enums @XmlEnum Serialisierung als Strings @XmlEnumValue @XmlType public class Person { optional Bestimmung des Strings @XmlType @XmlEnum public enum Sex { private Sex sex; ... @XmlAttribute public Sex getSex() { return sex; } } @XmlEnumValue("Male") MALE, @XmlEnumValue("Female") FEMALE; } SYSTEM SOFTWARE 21 Xml-Serialisierung: Listen @XmlElement @XmlType public class Person { ... private Sex sex; @XmlElement public List<Person> getChildren() { return Collections.unmodifiableList(children); } } SYSTEM SOFTWARE 22 Xml-Serialisierung: XmlAdapter (1 / 3) Bestimmte Java-Typen lassen sich schlecht abbilden Z.B. Arrays @XmlType public class Person { ... private char[][] logo; @XmlElement public char[][] getLogo() { return logo; } } Client-Side Stub @XmlType(name = "person", ... ) public class Person { ... protected List<UnsignedShortArray> logo; public List<UnsignedShortArray> getLogo() { ... return this.logo; } } SYSTEM SOFTWARE 23 Xml-Serialisierung: XmlAdapter (2 / 3) XML-Serialisierung über Umweg von XmlAdapter package javax.xml.bind.annotation.adapters; public abstract class XmlAdapter<ValueType,BoundType> { protected XmlAdapter() { } public abstract BoundType unmarshal(ValueType v) throws Exception; public abstract ValueType marshal(BoundType v) throws Exception; } Annotierung mit @XmlJavaTypeAdapter @XmlType public class Person { ... private char[][] logo; @XmlJavaTypeAdapter(LogoAdapter.class) public char[][] getLogo() { return logo; } } SYSTEM SOFTWARE 24 Xml-Serialisierung: XmlAdapter (3 / 3) marschall char[][] -> String und unmarshall String -> char[][] Client-Side Stub arbeitet mit Strings package personservice; import javax.xml.bind.annotation.adapters.XmlAdapter; @XmlType(name = "person", ... ) public class Person { ... protected String logo; public class LogoAdapter extends XmlAdapter<String, char[][]> { @Override public String marshal(char[][] logo) throws Exception { StringBuilder b = new StringBuilder(); for (char[] line : logo) { for (char c: line) { b.append(c); } b.append("\n"); } return b.toString(); } @Override public char[][] unmarshal(String logoString) throws Exception { String[] lines = logoString.split("\n"); char[][] logo = new char[lines.length][]; for (int i = 0; i < lines.length; i++) { logo[i] = new char[lines[i].length()]; for (int j = 0; j < lines[i].length(); j++) { logo[i][j] = lines[i].charAt(j); } } return logo; } } SYSTEM SOFTWARE public String getLogo() { return this.logo; } } { {'l'‚ 'o'}, {'g'‚ 'o'} } "lo\ngo" 25 Annotation der Parameter: @WebParam Parameternamen (für Client-Side) @WebService Ansonsten Parametername arg0 public class PersonManager { ... auf Client-Side @WebMethod public Person getPerson(@WebParam(name = "ssn") long ssn) { ... OUT und INOUT Parameter Mit Verwendung von Holder<T> @WebService public class PersonManager { ... @WebMethod public boolean selectPerson( @WebParam(mode = WebParam.Mode.INOUT, name = "selected") Holder<Person> holder ) { Person p = … holder.value = p; return true; } } SYSTEM SOFTWARE 26 Web Methods mit Exceptions (1/2) Web Methods können Exceptions werfen werden in SOAP kodiert und können am Client behandelt werden am Client eigene Exception-Klasse <XYException>_Exception Beispiel: getPerson mit PersonException WebMethod-Implementierung public class PersonException extends Exception { private long ssn; public PersonExcpetion(String message, long ssn) { super(message); this.ssn = ssn; } public long getSsn() { return ssn; } } @WebService public class PersonManager { ... @WebMethod public Person getPerson(@WebParam(name = "ssn") long ssn) throws PersonExcpetion { Person p = persons.get(ssn); if (p == null) { throw new PersonException("No person with ssn ", ssn); } return p; } } SYSTEM SOFTWARE 27 Web Methods mit Exceptions (2/2) Für Exception-Klasse wird zur Kodierung der Daten Bean-Klasse erzeugt package personservice.jaxws; @XmlRootElement(name = "PersonExcpetion", namespace = "http://personservice/") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "PersonExcpetion", namespace = "http://personservice/") public class PersonExcpetionBean { private String message; private long ssn; public String getMessage() { return this.message; } public long getSsn() { return ssn; } } Für Client wird eine eigene Exception-Klasse PersonException_Exception erzeugt, die die Daten der ursprünglichen Exception kapselt @WebFault(name = "PersonExcpetion", targetNamespace = "http://personservice/") public class PersonExcpetion_Exception extends Exception { private PersonExcpetion faultInfo; public PersonExcpetion_Exception(String message, PersonExcpetion faultInfo) {…} public PersonExcpetion getFaultInfo() { return faultInfo; } } Anwendung am Client Zugriff auf Daten der Exception try { Person p = port.getPerson(123401012000L); } catch (PersonExcpetion_Exception e) { … e.getFaultInfo.getMessage() … e.getFaultInfo().getSsn(); } SYSTEM SOFTWARE Zugriff auf Eigenschaften der ursprünglichen Exception 28 Web Services Einführung Web-Services in Java JAXB SOAP und WSDL Zusammenfassung SYSTEM SOFTWARE 32 XML-Struktur (vereinfacht, SOAP 1.2) <?xml version="1.0" ?> <soap:Envelope xmlns:soap=“http://www.w3c.org.2003/05/soap-envelope"> <soap:Header> <!-- (optional and extendable) --> <m:my xmlns:m="anURI" soap:mustUnderstand=“true" soap:role=“uri2" /> ... </soap:Header> <soap:Body> Umschlag (<Envelope>) Briefkopf (<Header>) mit beliebigen Metainformationen Brief (<Body>) data (depends on format and encoding) mit beliebigen XML-Daten <soap:Fault> <soap:Code>...who is responsible?... </Code> <soap:Reason>...textual description...</soap:Reason> <soap:Detail>...more error details...</soap:Detail> </soap:Fault> </soap:Body> </soap:Envelope> SYSTEM SOFTWARE Fehlerbeschreibungen 34 Grundstruktur von WSDL 1.1 <definitions> <types> </types> <message> <part> </part> </message> <portType> <operation> <input> <output> </operation> </portType> <binding> <operation> </binding> <service> <port> </service> </definitions> WSDL-Beschreibung eines Web-Services Typen beschrieben in <xsd:schema> einzelne Nachrichten Teile der Nachricht Interface-Beschreibung Operationen eines Interfaces Input-Nachricht Output-Nachricht abstrakter Teil Binden von Interfaces an Protokolle + Kodierung Beschreibung der Anbindung für jede Operation Servicebeschreibung URI und Anbindung für Port SYSTEM SOFTWARE konkreter Teil 38 Beispiel: WSDL for PersonManager (1 / 3) WSDL Beschreibung des PersonManager abgerufen vom Web-Server http://localhost:8080/WebServices/personservice?wsdl <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://personservice/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://personservice/" name="PersonManagerService"> <types> <xsd:schema> <xsd:import amespace="http://personservice/"schemaLocation="http://localhost:8080/WebServices/personservice?xsd=1"/> </xsd:schema> </types> <message name="getPersonName"> <part name="parameters" element="tns:getPersonName"/> </message> <message name="getPersonNameResponse"> <part name="parameters" element="tns:getPersonNameResponse"/> </message> <message name="addPerson"> <part name="parameters" element="tns:addPerson"/> </message> <message name="addPersonResponse"> … SYSTEM SOFTWARE 39 Beispiel: WSDL for PersonManager (2 / 3) ... <portType name="PersonManager"> <operation name="getPersonName"> <input wsam:Action="http://personservice/PersonManager/getPersonNameRequest" message="tns:getPersonName"/> <output wsam:Action="http://personservice/PersonManager/getPersonNameResponse" message="tns:getPersonNameResponse"/> </operation> <operation name="getNumberPersons"> <input wsam:Action="http://personservice/PersonManager/getNumberPersonsRequest" message="tns:getNumberPersons"/> <output wsam:Action="http://personservice/PersonManager/getNumberPersonsResponse" message="tns:getNumberPersonsResponse ... </portType> <binding name="PersonManagerPortBinding" type="tns:PersonManager"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="getPersonName"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="addPerson"> <input wsam:Action="http://personservice/PersonManager/addPersonRequest" message="tns:addPerson"/> <output wsam:Action="http://personservice/PersonManager/addPersonResponse" message="tns:addPersonResponse"/> </operation> ... </binding> <service name="PersonManagerService"> <port name="PersonManagerPort" binding="tns:PersonManagerPortBinding"> <soap:address location="http://localhost:8080/WebServices/personservice"/> </port> </service> </definitions> 40 SYSTEM SOFTWARE Beispiel: WSDL for PersonManager (3 / 3) Beschreibung der XML-Typen abgerufen vom Web-Server mit http://localhost:8080/WebServices/personservice?xsd=1 <xs:schema xmlns:tns="http://personservice/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://personservice/"> <xs:element name="addPerson" type="tns:addPerson"/> <xs:element name="addPersonResponse" type="tns:addPersonResponse"/> <xs:element name="getPerson" type="tns:getPerson"/> <xs:element name="getPersonResponse" type="tns:getPersonResponse"/> <xs:element name="getPersonName" type="tns:getPersonName"/> <xs:element name="getPersonNameResponse" type="tns:getPersonNameResponse"/> <xs:complexType name="person"> <xs:sequence> <xs:element name="age" type="xs:int"/> <xs:element name="children" type="tns:person" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="hobbies" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="logo" type="xs:string" minOccurs="0"/> <xs:element name="name" type="xs:string" minOccurs="0"/> </xs:sequence> <xs:attribute name="ssn" type="xs:long" use="required"/> <xs:attribute name="sex" type="tns:sex"/> </xs:complexType> <xs:complexType name="getPersonName"> <xs:sequence> <xs:element name="arg0" type="xs:long"/> </xs:sequence> </xs:complexType> ... </xs:schema> SYSTEM SOFTWARE 41 Annotationen Zusammenfassung WebService String endpointInterface The complete name of the service endpoint interface defining the service's abstract Web Service contract. String name The name of the Web Service. String portName The port name of the Web Service. String serviceName The service name of the Web Service. String targetNamespace If the @WebService.targetNamespace annotation is on a service endpoint interface, the targetNamespace is used for the namespace for the wsdl:portType (and associated XML elements). String wsdlLocation The location of a pre-defined WSDL describing the service. WebMethod String action The action for this operation. Boolean exclude Marks a method to NOT be exposed as a web method. String operationName Name of the wsdl:operation matching this method WebParam boolean header If true, the parameter is pulled from a message header rather then the message body. WebParam.Mode mode The direction in which the parameter is flowing (One of IN, OUT, or INOUT). String name Name of the parameter. String partName The name of the wsdl:part representing this parameter. String targetNamespace The XML namespace for the parameter. SYSTEM SOFTWARE 42 Annotationen Zusammenfassung XmlType Class factoryClass Class containing a no-arg factory method for creating an instance of this class. String factoryMethod Name of a no-arg factory method in the class specified in factoryClass factoryClass(). String name Name of the XML Schema type which the class is mapped. String namespace Name of the target namespace of the XML Schema type. String[] propOrder Specifies the order for XML Schema elements when class is mapped to a XML Schema complex type XmlElement String defaultValue Default value of this element. String name Name of the XML Schema element. String namespace XML target namespace of the XML Schema element. boolean nillable Customize the element declaration to be nillable. boolean required Customize the element declaration to be required. Class type The Java class being referenced. XmlAttribute String name Name of the XML Schema attribute. String namespace Specifies the XML target namespace of the XML Schema attribute. boolean required Specifies if the XML Schema attribute is optional or required. SYSTEM SOFTWARE 43 Web Services Einführung Web-Services in Java JAXB SOAP und WSDL Zusammenfassung SYSTEM SOFTWARE 44 Zusammenfassung Web-Services sind eine Middleware-Technologie auf der Basis von XML und Internet-Protokollen unabhängig von Programmiersprache und Laufzeitumgebung für die Integration heterogener, verteilter Systeme Java unterstützt Web-Service-Technologie javax.ws für Entwicklung von Web-Services mit Verwendung von Annotationen javax.xml.bind für JAXB-Datenbindung wsgen für Generierung von Ties (Brückencode) wsimport für Generierung von Stubs Entwicklung von Web-Service-Clients SYSTEM SOFTWARE 45 Literatur Horstmann, Cornell, Core Java 2, Volume II . Advance Features,Sun Microsystems, 2008: Chapter 10 The Java EE 6 Tutorial, Oracle Inc., 2012, http://docs.oracle.com/javaee/6/tutorial/doc/ The Java Web Services Tutorial 2.0, Oracle Inc., 2006, http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/2.0/tutorial/doc/ SYSTEM SOFTWARE 46