Web Services und SOAP XML XML Einführung ■ Sie wissen, was ein Web Service ist ■ Sie wissen, was SOAP ist ■ Sie wissen, wie eine SOAP Meldung aufgebaut ist ■ Sie können SOAP Meldungen mittels WSDL beschreiben ■ Sie können einen SOAP Web Service Klient und Server implementieren School of Engineering © K. Rege, ZHAW 1 von 64 Früher School of Engineering © K. Rege, ZHAW 2 von 64 Heute ? ■ Kunde sucht sich auf dem Internet die Hotel, Flug und Mietwagenfirmen-Seiten Fluggesellschaft FluggesellschaftWS WS Schifffahrtslinie SchifffahrtslinieWS WS html ■ Stellt sich ein passendes Angebot zusammen Credit CreditCard CardWS WS ? Kunde Kunde l htm Virtuelles VirtuellesReisebüro Reisebüro Bahn BahnWS WS ? Hotel HotelWS WS Kunde Kunde ? html Mietwagen Mietwagen WS WS htm l ■ Es braucht eine standardisierte, maschinell verarbeitbare Kommunikation zwischen Reisebüro und Dienstleistungsanbietern School of Engineering © K. Rege, ZHAW 3 von 64 School of Engineering © K. Rege, ZHAW 4 von 64 Definition Web-Service (nach W3C) (Web) Service Architektur - -Verwaltet VerwaltetServîce ServîceVerzeichnis Verzeichnis ■ Ein Web-Service ist folgendermassen definiert - -Ermöglicht Ermöglichtdas dasEintragen Eintragenvon vonServices Services Fi nd e Binde Service ServiceKonsument Konsument ■ Zweck ist Interoperation zwischen Maschinen ■ Schnittstelle beschrieben in maschinenlesbarer Form (WSDL) ■ Nachrichtenaustausch über SOAP Meldungen ■ meist via HTTP oder anderen Web Protokollen ■ Web Service ■ meist unter Verwendung von in XML kodierten Nachrichten ■ ■ 5 von 64 School of Engineering ■ SOAP ■ Vorteile ■ ■ ■ ■ ■ ■ Service Service Beschreibung Beschreibung "Vertrag" "Vertrag" Ein Web Service ist eine Funktion (Prozedur,Methode, Teil der Geschäftslogik), die via InternetTechnologien zugegriffen werden kann Daten werden meist in XML-Format übermittelt Vor- und Nachteile XML-Standard für Nachrichtenaustausch unabhängig von Transportprotokoll unabhängig von Client- und Service-Implementierung: Java, .NET, PHP, … Service ServiceAnbieter Anbieter - Konsumiert Dienste des Anbieters - Konsumiert Dienste des Anbieters - Sucht den gewünschten Dienst im - Sucht den gewünschten Dienst im Verzeichnis Verzeichnis - Stellt Verbindung mit dem - Stellt Verbindung mit dem Dienstanbieter her und nimmt Dienst Dienstanbieter her und nimmt Dienst in Anspruch in Anspruch Web Services ■ - -Beschreibt Beschreibtdie dieangebotenen angebotenenDienste Dienste wie wiesind sinddie dieDienste Diensteabrufbar? abrufbar? (Dienstleistungs-)Vertragsinhalt (Dienstleistungs-)Vertragsinhalt - Publiziert Dienste in Verzeichnis - Publiziert Dienste in Verzeichnis Beschreibt BeschreibtDienste Diensteso, so,dass dassKunden Kunden den denDienstanbieter Dienstanbieterfinden findenkönnen können e http://www.w3.org/TR/ws-gloss/ http://www.w3.org/TR/ws-gloss/ © K. Rege, ZHAW Service ServiceVerzeichnis Verzeichnis r zie bli Pu AAWeb Webservice serviceisisaasoftware softwaresystem systemdesigned designedtotosupEndPoint supEndPoint interoperable interoperablemachine-to-machine machine-to-machineinteraction interactionover overaanetwork. network. ItIthas an interface described in a machine-processable has an interface described in a machine-processableformat format (specifically WSDL). Other systems interact with the Web (specifically WSDL). Other systems interact with the Web service serviceininaamanner mannerprescribed prescribedby byitsitsdescription descriptionusing usingSOAPSOAPmessages, messages,typically typicallyconveyed conveyedusing usingHTTP HTTPwith withan anXML XML serialization serializationininconjunction conjunctionwith withother otherWeb-related Web-relatedstandards. standards. School of Engineering - -Bietet BietetDienste Dienstean: an: Teil Teilder derGeschäftslogik Geschäftslogik - -Ermöglicht Ermöglichtdas dasFinden Findenvon vonService Service Anbieter AnbieterAdressen Adressenanhand anhand unterschiedlicher unterschiedlicherKriterien Kriterien © K. Rege, ZHAW 6 von 64 unabhängig von Programmiersprache, Laufzeitumgebung und Betriebssystem baut auf bestehender Internet-Infrastruktur auf standardisiert von den grossen unterstützt/vorangetrieben (ABM und Microsoft) ■ Web Services Description Language - WSDL ■ Schnittstellen-Beschreibung in XML ■ Nachteile ■ ■ Kommunikation auf Basis existierenden Protokolle und Serverarchitekturen ■ ■ ■ ■ HTTP und Web-Server SMTP und Mail-Server FTP und FTP-Server ■ ■ Performance (XML) Gremien mit dominanten Vertretern mit Partikulärinteressen Standards z.T. komplex, zu allgemein gehalten (Kompromiss standarts) Erweiterbarkeit führt zu Interoperabilitätsproblemen ■ Standardisierung (W3C & WSI Gremium) ■ ■ SOAP 1.2, WSDL 1.1 (1.2 und 2.0) Zusätzliche Protokolle basierend auf SOAP und WSDL School of Engineering © K. Rege, ZHAW 7 von 64 School of Engineering © K. Rege, ZHAW 8 von 64 Web Services - SOAP ■ SOAP: Simple Object Access Protocol ■ Definiert ein Standard-Format für den Transport von XML Daten, via HTTP, SMTP und FTP für den Zugriff auf Web Services ■ WSDL: Web Service Description Language ■ Beschreibt die Schnittstelle eines Web Service (Ein-/Ausgabe Parameter, Protokoll Bindung, etc.) ■ UDDI: Universal Description, Discovery, and Integration ■ (Weltweites) Verzeichnis von Web Services in dem nach verschiedenen Kriterien gesucht werden kann SOAP Pu bli z Fi nd e UDDI UDDI Verzeichnis Verzeichnis ier e Service Verzeichnis Service Konsument HTTP-Request SOAP SOAP Klient Klient SOAP SOAP Fassade Fassade HTTP-Response WSDL WSDL School of Engineering © K. Rege, ZHAW 9 von 64 Basis Web Service Stack Web Services Service ServiceVerzeichnis Verzeichnis UDDI UDDI Service ServiceBeschreibung Beschreibung WSDL WSDL XML XMLMessaging Messaging SOAP SOAP Transport TransportNetzwerk Netzwerk HTTP, HTTP,SMTP,... SMTP,... School of Engineering Service Anbieter © K. Rege, ZHAW 10 von 64 Erweiterter Web Service Stack ■ In konkreten Anwendungsfall von Web Services sind Erweiterungen notwendig für Sicherheit, Transaktionssteuerung, etc. • stellt Verzeichnis für Web Services zur Verfügung Service Architektur GeschäftsGeschäftsLogik Logik • ermöglicht das Eintragen von Services (Publikation) • ermöglicht Finden von Adressen anhand folgender Kriterien • Weisse Seiten: nach Namen • Gelbe Seiten: nach Branchen • Grüne Seiten: Beschreibung der Dienstleistung ■ Werden angeboten ■ • beschreibt die Schnittstelle des Web Services in maschinenlesbarer Form ■ vom Anbieter des WS Infrastruktur ( Microsoft, IBM, Open Source) Standards z.T. noch nicht etabliert -> proprietäre, z.T. nicht interoperable Lösungen • unabhängig von Programmiersprache • beschreibt, welcher Transportmechanismus verwendet wird* Anwendung Anwendung • beschreibt, wo der Service zu finden ist* Workflow, Workflow, BPEL, XLANG(MS) BPEL, XLANG(MS) Network NetworkTransport TransportLayer Layer TCP/IP *Design Fehler WS-Attachement WS Adressing BinäreAnhänge Anhänge Binäre WS-Attachement Addressierung Addressierung WS Adressing WS Transactions WS Reliable Messaging . Zuverlässigkeit Zuverlässigkeit WS Reliable Messaging SOAP SMTP, FTP SOAPTransport TransportHTTP, HTTP, SMTP, FTP WS Security • im Intranet: auch andere Protokolle möglich: MQ Transaktionen Transaktionen WS Transactions • im Internet: basiert auf bestehenden Internet Protokollen: http, smtp, ftp Sicherheit Sicherheit WS Security XML XMLMessaging MessagingSOAP SOAP • stellt Transportmechanismus für Daten zur Verfügung UDDI • kann Transport Netzwerk verwenden (gebunden werden) WSDL .NET, JAX-WS .NET, JAX-WS • unabhängig von BS ServiceVerzeichnis Verzeichnis Service UDDI . XML XMLMessaging MessagingAPI API • meistens SOAP Format (XML basiert) ServiceBeschreibung Beschreibung Service WSDL • definiert das Meldungsformat TCP/IP School of Engineering © K. Rege, ZHAW 11 von 64 School of Engineering © K. Rege, ZHAW 12 von 64 WS-* SOAP Konkret Step 2 – Workshops & Community Dev Step 2 – Workshops & Community Dev ■ Stand der Implementierung (Ende 2008) ■ einfaches Nachrichtenformat in XML Step 3 – Standardization Step 3 – Standardization Step 4 – Approved Standard Step 4 – Approved Standard WS-Federation WS-Federation WS-Management WS-Management Devices Devices Profile Profile WS-Secure WS-Secure Conversation Conversation WS-Business WS-Business Activity Activity WS-Trust WS-Trust WS-Atomic WS-Atomic Transaction Transaction WS-Security WS-Security WS-Reliable WS-Reliable Messaging Messaging WS-Coordination WS-Coordination WS-Transfer WS-Transfer WS-Enumeration WS-Enumeration WS-Eventing WS-Eventing SOAP SOAP WS-Addressing WS-Addressing MTOM MTOM Infrastructure Infrastructure and andProfiles Profiles ■ ■ Metadata Metadata WS-Metadata WS-Metadata Exchange Exchange Assurances Assurances ■ Unabhängig vom Transportprotokoll WS-Discovery WS-Discovery ■ SOAP ist erweiterbar UDDI UDDI ■ ■ WS-Policy WS-Policy ■ Messaging Messaging WSDL WSDL XML XML Namespaces Namespaces School of Engineering MIME MIME ■ Foundation Foundation SOAP SOAP/ /UDP UDP Sicherheit Authentifikation etc. ■ Verschiedene Meldungsaustauschmuster durch kombination einzelner Nachrichten (Message Exchange Patterns) XML Schema XML Schema XML XMLInfoset Infoset XML 1.0 XML 1.0 für Verpackung beliebiger Anwendungsdaten einzelne Nachrichten („one-way“) one-way, request-response Client Client 1: GetTime_Request 2: GetTime_Response Server Server SOAP / HTTP SOAP / HTTP © K. Rege, ZHAW 13 von 64 Funktionsweise von SOAP über HTTP School of Engineering © K. Rege, ZHAW 14 von 64 SOAP Interaktionsmodelle Client Web Service ■ One Way: SOAP/SMTP <soapenv:Envelope> <soapenv:Body> <m:GetStockPrice> <Stock>INTC</Stock> </m:GetStockPrice> </soapenv:Body> </soapenv:Envelope> ■ Einweg Kommunikation: nur unbestätigte Aufruf Meldung vom Klient zum Web Service ■ Request-Response: SOAP/HTTP (hier behandelt) ■ Synchrone Kommunikation: Aufruf Meldung vom Klient zum Web Service mit Antwort vom Web Service Request (HTTP:POST) ■ Solicit Response: SOAP/SMTP Response (HTTP : 200 OK) Client <soapenv:Envelope> <soapenv:Body> <m:GetStockPriceResponse> <Price>34.5</Price> </m:GetStockPriceResponse> </soapenv:Body> </soapenv:Envelope> School of Engineering © K. Rege, ZHAW ■ StockQuote Service Asynchrone Kommunikation: einzelne unbestätigte Aufruf Meldung vom Klient zum Web Service, dann unbestätigte Antwort zurück ■ Notification: POP3 ■ Beispiel Request-Response Beispiel Request-Response 15 von 64 Benachrichtigung: einzelne unbestätigte Meldung vom Web Service zum Klient School of Engineering © K. Rege, ZHAW 16 von 64 Aufbau einer SOAP Meldung POST/objectURI HTTP/1.1 Informationen für den Transport der Nachricht Objekt Endpunkt SOAPAction Objekt Identifikation Informationen für den/die Empfänger der Nachricht soapenv:Envelope soapenv:Header Header 1 SOAP Meldungen Methoden Identifikation Erweiterungskopfteil Informationen über die Daten der Nachricht, Unterschrift, etc. Header 2 Meldungsdaten Daten soapenv:Body Logische Aufteilung Daten der Nachricht Daten SOAP Nachricht School of Engineering © K. Rege, ZHAW 17 von 64 Beispiel: Aufbau einer SOAP Meldung School of Engineering © K. Rege, ZHAW 18 von 64 HTTP-Header ■ POST HTTP HTTPHeader Header(def: (def:HTTP) HTTP) ■ SOAP Aufruf meist über POST ■ Content-Type: POST /Accounts HTTP/1.1 Host: www.webservicebank .com www.webservicebank.com Content-Length: nnnn Content-Type: text/xml ; charset=" utf-8" -8" text/xml; charset="utf SOAPAction: SOAPAction: "Some-URI" <?xml version="1.0" encoding="UTF-8"?> SOAP Envelope SOAP Envelope <SOAP:Envelope xmlns:SOAP="http://schemas. xmlsoap.org/soap/envelope/" .org/soap/envelope/" xmlns:SOAP="http://schemas.xmlsoap (def: SOAP) (def: SOAP) SOAP:encodingStyle ="http://schemas.xmlsoap xmlsoap.org/soap/encoding/"> .org/soap/encoding/"> SOAP:encodingStyle="http://schemas. <SOAP:Header> SOAP Header SOAP Header <t:Signature xmlns:t="some-URI" ="1"> xmlns:t="some-URI" SOAP:mustUnderstand SOAP:mustUnderstand="1"> (def: SOAP,opt) (def: SOAP,opt) 5984928340298340238475272938420348 </t:Signature> Header Entry Header Entry </SOAP:Header> (def:Applikation) (def:Applikation) <SOAP:Body> <m:Deposit xmlns:m="Some-URI"> xmlns:m="Some-URI"> SOAP Body <acctNumber>1234567890</ acctNumber> > acctNumber>1234567890</acctNumber SOAP Body (def:SOAP) <amount>200</amount> (def:SOAP) Body Entry Body Entry </m:Deposit> (def:Applikation) (def:Applikation) </SOAP:Body> </SOAP:Envelope> School of Engineering © K. Rege, ZHAW 19 von 64 ■ text/xml und charset=utf-8 (Unicode variabler Länge) ■ Host: Ziel-Maschinenname ■ SOAPAction: ■ für Routing und Dispatching von SOAP Meldungen ■ ab SOAP 1.2 nicht mehr verwendet, da nur für HTTP gültig ■ Action: "" bei POST wird direkt der Endpunkt des Services angegeben Request POST /axis/services/MyService HTTP/1.0 POST /axis/services/MyService HTTP/1.0 Content-Type: text/xml; charset=utf-8 Content-Type: text/xml; charset=utf-8 Host: localhost Host: localhost SOAPAction: "" SOAPAction: "" … … … … Content-Length: 414 Content-Length: 414 <?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?> School of Engineering Response HTTP/1.1 200 OK HTTP/1.1 200 OK Content-Type: text/xml; charset="utf-8" Content-Type: text/xml; charset="utf-8" … … … … Content-Length: 564 Content-Length: 564 <?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?> © K. Rege, ZHAW 20 von 64 HTTP-Aufruf (GET-POST) Beispielaufruf via HTTP-GET bzw. -POST ■ Aufruf über HTTP-GET ■ ■ Aufruf von GetTime(bool shortForm) bei Web-Service http://localhost/time/TimeService.asmx Aufruf HTTP-kodiert (URL-encoded) Response XML-kodiert Aufruf : Î Einschränkung auf einfache Aufrufe (keine Header-Einträge, keine strukturierten Daten) ■ Aufruf über HTTP-POST ■ ■ http://localhost/time/TimeService.asmx/GetTime?shortForm=true http://localhost/time/TimeService.asmx/GetTime?shortForm=true HTTP-Response: Datenteil des POST-Request enthält SOAP-kodierte Anfrage Antwort SOAP-kodiert HTTP/1.1 HTTP/1.1200 200OK OKContent-Type: Content-Type:text/xml; text/xml;charset=utf-8 charset=utf-8Content-Length: Content-Length:length length<?xml <?xml version="1.0" version="1.0"encoding="utf-8"?> encoding="utf-8"?> <string <stringxmlns="http://tempuri.org/">string</string> xmlns="http://tempuri.org/">string</string> Î ohne Einschränkungen School of Engineering © K. Rege, ZHAW 21 von 64 School of Engineering © K. Rege, ZHAW SOAP Envelope SOAP Header ■ Envelope Element ■ Kann verwendet werden um anwendungsspezifische Information zur Meldung hinzuzufügen, z.B. Authentisierung, Transaktionssteuerung ■ definiert in Namespace: http:// schemas. .xmlsoap. http://schemas xmlsoap.org/ org/soap/ soap/envelope/ envelope/ ■ beinhaltet Kind-Elemente ■ Header: Kopfteil (optional) : Informationen über die Meldung ■ Body: Daten (Payload) ■ Fault: als Teil von Body (optional) bei Fehler ■ 22 von 64 wird dem Body vorangestellt ■ Ermöglicht das "piggybacking" von Metainformation (Information über Daten) ■ ■ ■ <?xml version="1.0" encoding="UTF-8"?> <soapenv: http:// ://schemas schemas. .xmlsoap. soapenv:Envelope xmlns: xmlns:soapenv=" soapenv="http xmlsoap.org/ org/soap/ soap/envelope/" envelope/" Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" EnvelopeNamespaces Namespaces xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> > <soapenv: soapenv:Header> Header> … … </soapenv :Header> </soapenv: Header> <soapenv: soapenv:Body> Body> … … <soapenv :fault> <soapenv: fault> Schema Namespaces Schema Namespaces … … </soapenv :fault> </soapenv: fault> </soapenv :Body> </soapenv: Body> </soapenv :Envelope> </soapenv: Envelope> zusätzliche (Status) Informationen Sicherheit, etc. Wird von der Infrastruktur interpretiert <?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 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-instance"> <SOAP:Header > <SOAP:Header soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/> <SOAP:Header soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/> <t:Signature some-URI" -URI" <t:Signature xmlns:t=" xmlns:t="some <t:Signature xmlns:t="some-URI" SOAP:mustUnderstand ="1" xsi:type="xsd:string"> > SOAP:mustUnderstand="1" SOAP:mustUnderstand="1" xsi:type="xsd:string"> 5984928340298340238475272938420348 5984928340298340238475272938420348 </t:Signature > </t:Signature> </t:Signature> </SOAP:Header > </SOAP:Header> </SOAP:Header> </soapenv:Envelope> </soapenv:Envelope> School of Engineering © K. Rege, ZHAW 23 von 64 School of Engineering © K. Rege, ZHAW 24 von 64 SOAP Body Die Datenformat im <Body>-Element ■ Im Body werden die eigentlichen Daten übertragen ■ Daten im <Body> Element sind grundsätzlich frei wählbar (wellformed XML) ■ Meist jedoch durch Schema definierte Struktur literal: literal:on-the-wire on-the-wireFormat Formatinin einem einemSchema Schemadefiniert definiert(exact) (exact) document: document:ÜberÜbermittlung mittlungeines eines Dokuments Dokuments Request <?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 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-instance"> <soapenv:Header …/> <soapenv:Header …/> <soapenv:Body> Body> <soapenv:Body> <m:Deposit Some-URI"> -URI"> <m:Deposit xmlns:m=" xmlns:m="Some <m:Deposit xmlns:m="Some-URI"> <acctNumber>1234567890</ acctNumber> > acctNumber>1234567890</acctNumber <acctNumber>1234567890</acctNumber> <amount >200</amount amount> > <amount>200</ <amount>200</amount> </m:Deposit > </m:Deposit> </m:Deposit> </soapenv:Body> Body> </soapenv:Body> Response rpc: rpc:Aufruf Aufrufeiner einer Funktion Funktion </soapenv:Envelope> </soapenv:Envelope> School of Engineering © K. Rege, ZHAW 25 von 64 … Die Daten im <Body>-Element encoded: encoded:on-the-wire on-the-wireFormat Formatentspricht entspricht nicht nichtdem demSchema Schemasondern sonderndem demdefinierten definierten Encoding z.B SOAPEndcoding Encoding z.B SOAPEndcoding <soap:envelope> <soap:envelope> <soap:body> <soap:body> <myMethodData> <myMethodData> <x>5</x> <x>5</x> </myMethodData> </myMethodData> </soap:body> </soap:body> </soap:envelope> </soap:envelope> <soap:envelope> <soap:envelope> <soap:body> <soap:body> <myMethodData> <myMethodData> <x xsi:type="xsd:int">5</x> <x xsi:type="xsd:int">5</x> </myMethodData> </myMethodData> </soap:body> </soap:body> </soap:envelope> </soap:envelope> <soap:envelope> <soap:envelope> automatisch automatisch <soap:body> <soap:body> <myMethod> <myMethod> <x>5</x> <x>5</x> </myMethod> </myMethod> </soap:body> </soap:body> </soap:envelope> </soap:envelope> <soap:envelope> <soap:envelope> automatisch <soap:body> automatisch <soap:body> <myMethod> <myMethod> <x xsi:type="xsd:int">5</x> <x xsi:type="xsd:int">5</x> </myMethod> </myMethod> </soap:body> </soap:body> </soap:envelope> </soap:envelope> School of Engineering © K. Rege, ZHAW 26 von 64 Serialisierung von Datenstrukturen ■ Abbildung der einfachen Datentypen der Programmiersprache ■ Nachrichtenformat: ■ ■ rpc Methodenname als Teil der Meldung ■ document Methodenname nicht Teil der Meldung folgende Abbildungsregeln (=Binding) werden für Java angewandt JAX-B-Compatible Type Mapping ■ Kodierung: ■ literal Daten werden nach einem XML-Schema kodiert ■ encoded Daten werden nach SOAP-Regeln (Section 5) kodiert ■ übliche Kombinationen: ■ document/literal die heute am häufigsten verwendetes Format, beste Interoperabilität ■ rpc/literal verwendet bei Java Umfeld, weniger Hilfs-/Wrapper Klassen ■ rpc/encoded früher häufig verwendet School of Engineering © K. Rege, ZHAW http://java.sun.com/webservices/docs/1.5/tutorial/doc/JAXBWorks2.html http://java.sun.com/developer/technicalArticles/WebServices/jaxb/ 27 von 64 School of Engineering © K. Rege, ZHAW 28 von 64 … Serialisierung von Datenstrukturen … Serialisierung von Datenstrukturen „single-reference“ und "nested" Strukturen (Klassen) werden eingebettet <e:Book> <title>My Life and Work</title> <author> <name>Henry Ford</name> <address> <email>mailto:[email protected]</email> <web>http://www.henryford.com</web> </address> </author> </e:Book> ■ Einfache Datentypen werden einfach in XML Elemente abgebildet ■ ■ ■ Element-Name = Variablen Name Element-Inhalt = Wert Typ durch XSD Schema definiert xsi:type=„xsd:string xsi:type=„xsd:string „multi-reference“ Strukturen verwenden id & href attributes <title> My Life and Work </title> <price> 49.95 </price> <e:Books> <e:Book> <title>My Life and Work</title> <author href="#Person-1"/> </e:Book> <e:Book> <title>The Success of Tin Lizzy</title> <author href="#Person-1"/> </e:Book> </e:Books> <e:Person id="Person-1"> <name>Henry Ford</name> <address> <email>mailto:[email protected]</email> <web>http://www.henryford.com</web> </address> </e:Person> xsi:type=„xsd:float xsi:type=„xsd:float ■ Arrays und Listen einfach als Sequenz von gleichen XML Elementen Andere Collections Andere Collections problematisch problematisch School of Engineering © K. Rege, ZHAW 29 von 64 School of Engineering © K. Rege, ZHAW Konsequenzen des litteral Formats SOAP Fault ■ Body Daten sind durch Schema bzw. WSDL beschrieben ■ Fault: Ein Fehler ist aufgetreten ■ ■ Vorteil: Meldung kann mit Schema validiert werden Nachteil: Bei nicht Baum Daten Strukturen komplex (Z.B. Graphen, Mehrfachreferenzen) ■ 30 von 64 erstes/einziges Element von Body ■ faultcode: Klassifizierung des Fehlers ■ ■ <?xml version="1.0" ?> <?xml version="1.0" ?> <xsd:schema> <xsd:schema> ■ ■ <xsd:complexType name="arg"> <xsd:complexType name="arg"> <xsd:sequence> <xsd:sequence> <xsd:element type="xsd:double" name="arg0"/> <xsd:element type="xsd:double" name="arg0"/> <xsd:element type="xsd:double" name="arg1"/> <xsd:element type="xsd:double" name="arg1"/> </xsd:sequence> </xsd:sequence> </xsd:complexType > </xsd:complexType > MustUnderstand (Header with mustUnderstand=1 nicht verstanden) VersionMismatch (falsche namespace) Client (Fehler in request Meldung vom Klienten) Server (Fehler auf der Server Seite) ■ faultString/detail: Beschreibung des Fehlers HTTP HTTPResult: Result:500 500 HTTP/1.1 500 Internal Server Error Content-Type: text/xml; charset=utf-8 <xsd:element name="op1" type="listing3:op1Type" /> <xsd:element name="op1" type="listing3:op1Type" /> </wsdl:types> </wsdl:types> <soapenv:Envelope … > <soapenv:Body> <soapenv:Fault> <faultcode>ns1:Server.userException</faultcode> <faultstring>java.rmi.RemoteException: Overflow</faultstring> <detail><ns2:stackTrace xmlns:ns2="http://xml.apache.org/axis/">java.rmi.RemoteException: </xsd:schema> ... </xsd:schema> ... <soapenv:Body> <soapenv:Body> <arg> <arg> <arg0>20.0</arg0> <arg0>20.0</arg0> <arg1>22.0</arg1> <arg1>22.0</arg1> </arg> </arg> </soapenv:Body> </soapenv:Body> </soapenv:Envelope> </soapenv:Envelope> at calc.CalculatorSoapBindingImpl.add(CalculatorSoapBindingImpl.java:12) </detail> </soapenv:Fault> </soapenv:Body> </soapenv:Envelope> School of Engineering © K. Rege, ZHAW 31 von 64 School of Engineering © K. Rege, ZHAW 32 von 64 Fragen und Fakten zu WSDL ■ Wieso sollte man WSDL kennen? ■ ■ ■ Wieso ist WSDL so kompliziert? ■ ■ Servicebeschreibung mit WSDL ■ ■ ■ © K. Rege, ZHAW 33 von 64 früh entwickelt (noch bevor XSD fertig definiert war) grosse Allgemeinheit abgedeckt (Protokolle, Aufrufmodelle, etc.) Werkzeuge zur Erstellung ■ School of Engineering Standard-Beschreibungssprache für Web Service Schnittstellen finden von Interoperabilitätsproblemen Texteditor: ziemlich mühsam (sollte man aber einmal gemacht haben) mit graphischen Werkzeugen: einfacher aber kein Standard, z.B. XMLSpy Finden von WSDL ■ die meisten Web-Service Implementationen liefern Schnittstelle (automatisch) ■ <Web Service URL>?WSDL ■ Verzeichnisse auf dem Internet (siehe Anhang) School of Engineering © K. Rege, ZHAW Service Schnittstellen Beschreibung Web Service Description Language (WSDL) ■ Funktionen einer Schnittstellen Beschreibungssprache (IDL) ■ WSDL ist XML-basierte IDL für Web-Services ■ ■ von Menschen lesbar und erstellbar ■ Definition der Schnittstelle (SW Engineering ⇒ zuerst) "interface first" Ansatz ■ Dokumentation 34 von 64 ■ in WSDL wird beschrieben: von Maschine lesbar ■ zur Laufzeit: überprüfen ob Daten mit Schnittstelle konform(Validierung) ■ zur Entwicklungszeit: Generierung von Hilfsklassen ■ Implementierungsrumpf für Web Services ■ Stub (Stumpf) für den Aufruf ■ Service Interface ■ Verwendete Datentypen ■ Aufbau einzelner Nachrichten ■ Operationen (Methoden) ■ Service Implementation ■ Protokolle um Operationen aufzurufen ■ Adressen für Web-Service ■ Web Service Definition Language WSDL ■ ■ WSDL 1.0 15. März 2001 definiert Version 2.0 (früherer Name = 1.2) seit Juni 2007 W3C Recommendation ■ Umbenennung: Port->Endpoint; definition -> describtion; Interface-> Interface ■ Elimination von Message (-> wird zu XSD Complex Type) School of Engineering © K. Rege, ZHAW 35 von 64 School of Engineering © K. Rege, ZHAW 36 von 64 Struktur eines WSDL Dokuments Aufbau eines WSDL Dokuments ■ Struktur eines WSDL Dokuments (von 1.1 zu 2.0) ■ ■ ■ z.B. z.B.HTTP+SOAP HTTP+SOAP message -> x portType -> interface port -> endpoint EndPoint Verwendung Verwendungvon von XML-Schema XML-Schema Operation Type/ Element EndPoint Service Binding (Interface) Interface (abstraktes Interface) Operation request/ response Types Type/ Element Type/ Element EndPoint Operation Operationen Web Service Protokoll abstraktes Interface Typen & Elemente http://ssagara.blogspot.com/2009/01/converting-wsdl11-to-wsdl20-using-woden.html http://en.wikipedia.org/wiki/Web_Services_Description_Language School of Engineering © K. Rege, ZHAW 37 von 64 Aufbau eines WSDL Dokuments School of Engineering © K. Rege, ZHAW 38 von 64 Grundstruktur von WSDL 2.0 ■ Type/Element Definiert Typen und Strukturen als XML Schema ■ Request/Response Data Strukture Type ■ definieren wie die Typen verwendet werden ■ Operation ■ verknüpft 2 (1) Meldung: request-response WSDL-Beschreibung eines Web-Services <definitions> Typen beschrieben in <xsd:schema> <types> <xsd;...> einzelne Nachrichten </xsd:...> Teile der Nachricht <xsd:complexType> </xsd:complexType> abstrakter </types> Teil Interface-Beschreibung <interface> Operationen eines Interfaces <operation> Input-Nachricht <input> Output-Nachricht <output> </operation> </interface> Binden von Interfaces an Protokolle + Kodierung <binding> Beschreibung der Anbindung für jede Operation <operation> </binding> konkreter Servicebeschreibung <service> Teil URI und Anbindung für Endpoint <endpoint> </service> </definitions> abstraktes Interface ■ ■ Interface ■ Binding ■ fügt protokollspezifische Information zu Interface hinzu ■ EndPoint ■ ist die Schnittstelle eines Web Services (instance) ■ (Web) Service kann verschiedene Schnittstellen (EndPoints) haben School of Engineering © K. Rege, ZHAW Protokoll verknüpft mehrere Operationen zu einem abstrakten Interface Web Service ■ 39 von 64 School of Engineering © K. Rege, ZHAW 40 von 64 Beispiel Abstrakter Teil Beispiel Konkreter Teil ■ Types Abschnitt der WSDL ■ Konkreter Teil ■ ■ häufig in separate XSD Datei und mittels <include> hineingenommen <?xml version="1.0" encoding="UTF-8"?> <description xmlns="http://www.w3.org/ns/wsdl" xmlns:tns="http://www.example.com/wsdl20sample" xmlns:whttp="http://www.w3.org/ns/wsdl/http" xmlns:wsoap="http://www.w3.org/ns/wsdl/soap" targetNamespace="http://www.example.com/wsdl20sample"> <!-- Abstract types --> <types> <xs:schema xmlns="http://www.example.com/wsdl20sample" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/wsdl20sample"> <xs:element name="request"> <xs:complexType> <xs:sequence> <xs:element name="header" maxOccurs="unbounded"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="name" type="xs:string" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="body" type="xs:anyType" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> School of Engineering <xs:element name="response"> <xs:complexType> <xs:sequence> <xs:element name="header" maxOccurs="unbounded"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="name" type="xs:string" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="body" type="xs:anyType" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> </types> ■ @WebService() @WebService() public class Timer { public class Timer { @WebMethod @WebMethod public String getTime(String format) { public String getTime(String format) { ... ... } } } } <!-- Concrete Binding Over HTTP --> <binding name="InterfaceHttpBinding" interface="tns:Interface" type="http://www.w3.org/ns/wsdl/http"> …. <operation ref="tns:getTime" whttp:method="POST"/> </binding> <!-- Web Service offering endpoint --> <service name="TimeService" interface="tns:Timer"> <endpoint name="ServiceSoapEndpoint" binding="tns:InterfaceHttpBinding" address="http://www.example.com/soap/"/> </service> </description> <!-- Abstract interfaces --> <interface name="Timer"> <operation name="getTime" pattern="http://www.w3.org/ns/wsdl/in-out"> <input messageLabel="GetMsg" element="tns:request"/> <output messageLabel="SuccessfulMsg" element="tns:response"/> </operation> </interface> © K. Rege, ZHAW beschreibt das verwendete Protokoll ■ für jede einzelne Operation ■ heute oft auch noch REST Binding beschreibt die URL des Endpoints ■ oft Ursache von Problemen (später) 41 von 64 Aufbau eines WSDL Dokuments - Struktur School of Engineering © K. Rege, ZHAW 42 von 64 Interface - Typen & Elemente abstraktes Interface ■ Die Typen und Elemente werden mittels XML Schemas beschrieben Protokoll <wsdl:definitions <wsdl:definitions name="Calculator" name="Calculator" targetNamespace="http://localhost:8080/axis/Calculator" targetNamespace="http://localhost:8080/axis/Calculator" Namesspaces Namesspaces xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:impl="http://localhost:8080/axis/Calculator" …… >zusätzlicher Schemas xmlns:impl="http://localhost:8080/axis/Calculator" …import …import >zusätzlicherSchemas <wsdl:types> <wsdl:types> <xsd:schema> <xsd:schema> ... ... </xsd:schema> </xsd:schema> <xsd:import> <xsd:import> namespace="…" namespace="…" location location == "…" "…" /> /> <xs:element <xs:element name="request" name="request" name="addResponse"> name="addResponse"> </xs:element </xs:element >> Binding Bindingdefiniert definiert <xs:element endpoint <xs:element name="response"> name="response"> endpointTyp: Typ:. .Interface Interface </xs:element > </xs:element > </wsdl:types> </wsdl:types> <wsdl:interface <wsdl:interface name="Calculator"> name="Calculator"> ... ... ... ... </wsdl:interface> </wsdl:interface> <wsdl:binding <wsdl:binding name="CalculatorSoapBinding" name="CalculatorSoapBinding" type="impl:Calculator"> type="impl:Calculator"> ... endpoint ... ... ... endpointfügt fügtprot. prot. </wsdl:binding> abh. Bindung hinzu </wsdl:binding> Web Service abh. Bindung hinzu <wsdl:service <wsdl:service name="CalculatorService"> name="CalculatorService"> <wsdl:endpointbinding="impl:CalculatorSoapBinding" <wsdl:endpointbinding="impl:CalculatorSoapBinding" name="Calculator"> name="Calculator"> </wsdl:endpoint> </wsdl:endpoint> </wsdl:service> </wsdl:service> Service </wsdl:definitions> Servicemit mit </wsdl:definitions> ■ Deklaration der Typen, die in Aufruf verwendet werden ■ double add(double a, double b) <wsdl:types> <wsdl:types> <xsd:schema <xsd:schema targetNamespace='http://localhost:8080/axis/CalcMessage/' targetNamespace='http://localhost:8080/axis/CalcMessage/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:typens='http://localhost:8080/axis/CalcMessage/'> xmlns:typens='http://localhost:8080/axis/CalcMessage/'> <xsd:element <xsd:element name="op1" name="op1" type="xsd:double" type="xsd:double" /> /> <xsd:element <xsd:element name="op2" name="op2" type="xsd:double" type="xsd:double" /> /> <xsd:element name="result" type="xsd:double" <xsd:element name="result" type="xsd:double" /> /> </xsd:schema> </xsd:schema> </wsdl:types> </wsdl:types> <soapenv:Body> <soapenv:Body> <ns1:add xmlns:ns1="http://localhost:8080/axis/Calculator"> <ns1:add xmlns:ns1="http://localhost:8080/axis/Calculator"> <arg0 xsi:type="xsd:double">20.0</arg0> <arg0 xsi:type="xsd:double">20.0</arg0> <arg1 xsi:type="xsd:double">22.0</arg1> <arg1 xsi:type="xsd:double">22.0</arg1> </ns1:add> </ns1:add> </soapenv:Body> </soapenv:Body> </soapenv:Envelope> </soapenv:Envelope> EndPoints EndPoints School of Engineering © K. Rege, ZHAW 43 von 64 School of Engineering © K. Rege, ZHAW 44 von 64 Interface - Typen & Elemente Komplexe Typen Einbezug von externen Schemas ■ Es können eigene Typen definiert werden ■ Oft besser Datentypen nicht in WSDL sondern in externen Schemas zu definieren ■ ■ Grundsätzlich voller XSD Umfang, ■ ■ aber meist nicht vollständig implementiert ■ können in mehreren WSDL verwendet werden übersichtlicher Werkzeugunterstützung <?xml version="1.0" ?> <?xml version="1.0" ?> <xsd:schema targetNamespace="urn:listing3" <xsd:schema targetNamespace="urn:listing3" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:import namespace="http://www.w3.org/2001/XMLSchema"/> <xsd:import namespace="http://www.w3.org/2001/XMLSchema"/> <wsdl:types> <wsdl:types> <xsd:schema <xsd:schema targetNamespace='http://localhost:8080/axis/CalcMessage/' targetNamespace='http://localhost:8080/axis/CalcMessage/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:typens='http://localhost:8080/axis/CalcMessage/'> xmlns:typens='http://localhost:8080/axis/CalcMessage/'> <xsd:simpleType name="op1Type"> <xsd:simpleType name="op1Type"> <xsd:restriction base="xsd:double" /> <xsd:restriction base="xsd:double" /> </xsd:simpleType> </xsd:simpleType> <xsd:simpleType <xsd:simpleType name="op1Type"> name="op1Type"> <xsd:restriction <xsd:restriction base="xsd:double" base="xsd:double" /> /> </xsd:simpleType> </xsd:simpleType> <xsd:element name="op1" type="listing3:op1Type" /> <xsd:element name="op1" type="listing3:op1Type" /> </wsdl:types> </wsdl:types> </xsd:schema> </xsd:schema> <wsdl:types> <wsdl:types> <xsd:schema <xsd:schema targetNamespace='http://localhost:8080/axis/CalcMessage/' targetNamespace='http://localhost:8080/axis/CalcMessage/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:typens='http://localhost:8080/axis/CalcMessage/'> xmlns:typens='http://localhost:8080/axis/CalcMessage/'> <xsd:import <xsd:import namespace="urn:listing3" namespace="urn:listing3" schemaLocation="listing3.xsd" schemaLocation="listing3.xsd" /> /> <xsd:element <xsd:element name="op1" name="op1" type="typens:op1Type" type="typens:op1Type" /> /> </wsdl:types> </wsdl:types> School of Engineering © K. Rege, ZHAW 45 von 64 <xsd:element <xsd:element name="op1" name="op1" type="listing3:op1Type" type="listing3:op1Type" /> /> </xsd:schema> </xsd:schema> </wsdl:types> </wsdl:types> School of Engineering © K. Rege, ZHAW Interface - message und part abstraktes Interface - Interface ■ Definition wie die Typen verwendet werden: ■ Interface definiert ein (abstraktes) Interface ■ ■ fasst definierte Typen zu Meldungen zusammen entspricht in Java der Liste der formalen Parameter in Methode: ■ ■ ■ enthält eine oder mehrere operations ■ [double] add([double a, double b]) es können auch direkt XSD Typen verwendet werden: entspricht in Java dem Interface ■ Definiert Eingabe und Ausgabe-Meldung element="xsd:double" ■ ■ <wsdl:types> <wsdl:types> <xsd:schema … … > <xsd:schema … … > <xsd:element name="op1" type="xsd:double" /> <xsd:element name="op1" type="xsd:double" /> <xsd:element name="op2" type="xsd:double" /> <xsd:element name="op2" type="xsd:double" /> <xsd:element name="result" type="xsd:double" /> <xsd:element name="result" type="xsd:double" /> </xsd:schema> </xsd:schema> </wsdl:types> </wsdl:types> interface interface Calculator Calculator {{ double double add(double add(double a, a, double double b); b); }} wsdl:input = request wsdl:output = response "Messages" <xs:element name="request"> <xs:element name="request"> ... ... </xs:element> </xs:element> Types Name Namedes desMeldungstyp Meldungstyp <xs:element <xs:element name="request"> name="request"> ... ... </xs:element> </xs:element> Typ Typdes desMeldungsteils Meldungsteils(part) (part) <xs:element <xs:element name="response"> name="response"> ... ... </xs:element> </xs:element> Namen der Operation(en) Namen der Operation(en) © K. Rege, ZHAW <xs:element name="response"> <xs:element name="response"> ... ... </xs:element> </xs:element> Name Namedes desInterfaces Interfaces <wsdl:Interface <wsdl:Interface name="Calculator"> name="Calculator"> <wsdl:operation <wsdl:operation name="add" name="add" pattern="http://www.w3.org/ns/wsdl/in-out"> pattern="http://www.w3.org/ns/wsdl/in-out"> <wsdl:input <wsdl:input messageLabel="addRequestOp" messageLabel="addRequestOp" element="tns:request"/> element="tns:request"/> <wsdl:output <wsdl:output messageLabel="addResponseOp" messageLabel="addResponseOp" element="tns:response"/> element="tns:response"/> </wsdl:operation> </wsdl:operation> </wsdl:Interface> </wsdl:Interface> Meldungen für request und response Meldungen für request und response Namen Namendes desMeldungsteils Meldungsteils School of Engineering 46 von 64 47 von 64 School of Engineering © K. Rege, ZHAW 48 von 64 Protokoll - binding konkretes Interface: EndPoint und Service Interface ■ binding: bindet Interface an Protokoll <wsdl:Interface name="Calculator"> <wsdl:Interface name="Calculator"> <wsdl:operation name="add" … > <wsdl:operation name="add" … > <wsdl:input name="addRequestOp" … /> <wsdl:input name="addRequestOp" … /> <wsdl:output name="addResponseOp" … /> <wsdl:output name="addResponseOp" … /> </wsdl:operation> </wsdl:operation> </wsdl:Interface> </wsdl:Interface> ■ enthält eine oder mehrere operations ■ Alle Alle Operationen Operationen entspricht Aufbau von Interface ■ Service definiert ■ endpoint: protokollabhängiges, konkretes Interface ■ mehrere EndPoints, für verschiedene Protokolle möglich ■ wsdlsoap:address : Adress-Element des EndPoints ■ location Attribut: URI des EndPoints <wsdl:binding <wsdl:binding name="CalculatorSoapBinding" name="CalculatorSoapBinding" type="impl:Calculator"> type="impl:Calculator"> Name Namedes des <wsdlsoap:binding Interfaces <wsdlsoap:binding style="rpc" style="rpc" Interfaces Transport="http://schemas.xmlsoap.org/soap/http"/> Transport="http://schemas.xmlsoap.org/soap/http"/> verwende <wsdl:operation verwendeHTTP HTTP <wsdl:operation name="add"> name="add"> Name der für <wsdl:input Name der fürTransport Transport <wsdl:input name="addRequestOp"> name="addRequestOp"> Operation Operation Namen des Namen des EndPoints EndPoints …… …… </wsdl:input> </wsdl:input> <wsdl:output <wsdl:output name="addResponseOp"> name="addResponseOp"> …… …… </wsdl:output> </wsdl:output> </wsdl:operation> </wsdl:operation> </wsdl:binding> </wsdl:binding> <wsdl:binding name="CalculatorSoapBinding" ...> <wsdl:binding name="CalculatorSoapBinding" ...> <wsdlsoap:binding /> <wsdlsoap:binding /> <wsdl:operation name="add"> <wsdl:operation name="add"> ... ... </wsdl:operation> </wsdl:operation> </wsdl:binding> </wsdl:binding> Namen Namendes desService Service <wsdl:service <wsdl:service name="CalculatorService"> name="CalculatorService"> <wsdl:endpoint <wsdl:endpoint name="Calculator" name="Calculator" binding="impl:CalculatorSoapBinding" binding="impl:CalculatorSoapBinding" >> <wsdlsoap:address <wsdlsoap:address location="http://localhost:8080/axis/services/Calculator"/> location="http://localhost:8080/axis/services/Calculator"/> </wsdl:endpoint> </wsdl:endpoint> </wsdl:service> </wsdl:service> Namen der Namen der Operationsteile Operationsteile URL des Web Services URL des Web Services School of Engineering © K. Rege, ZHAW 49 von 64 Steuerung des Serialisierungsformats ■ "literal" : übermittelte Daten im Body entsprechen (exakt) dem Schema. "encoded": übermittelte Daten im Body sind nach encodingStype Attribut definiertem Verfahren codiert (z.B. Section 5) ■ encodingStyle: identifiziert Regel, wie serialisiert werden soll ■ es können beliebige (eigene) Encodingformate definiert werdenn ■ oft Section 5 Encoding "http://schemas.xmlsoap.org/soap/encoding/" ■ class addRequestOp { class addRequestOp { double a,b double a,b } } double double add(addRequestOp add(addRequestOp msg); msg); © K. Rege, ZHAW ■ Detaillierte Fehlermeldung kann definiert werden ■ fault folgt dem body Element ■ ■ "rpc" erstes Kind Element von Body Element wird automatisch erzeugt ( Namen der Method); Daten werden als Kind Elemente übergeben double "dokument" es wird nur ein Element beim Aufruf übergeben; double add(double add(double a, a, double double b); b); diese Element enthält alle Daten School of Engineering 50 von 64 gleich wie input und output: message,Interface, binding ■ Wird eher selten gemacht ■ style: beschreibt den Stil (Struktur) des Aufruf ■ © K. Rege, ZHAW Fehler: Faults ■ use: beschreibt auf welche grundsätzliche Art die Daten serialisiert werden sollen ■ School of Engineering 51 von 64 Standard-Fehlerelement wird stattdessen verwendet <wsdl:definitions ... <wsdl:definitions ... ... ... <wsdl:message name='overflow'> <wsdl:message name='overflow'> <wsdl:part name='overflowFault' element='xsd:string' /> <wsdl:part name='overflowFault' element='xsd:string' /> </wsdl:message> </wsdl:message> <wsdl:Interface ... <wsdl:Interface ... <wsdl:operation name='add'> <wsdl:operation name='add'> <wsdl:input message='wsdlns:divideRequest' /> <wsdl:input message='wsdlns:divideRequest' /> <wsdl:output message='wsdlns:divideResponse' /> <wsdl:output message='wsdlns:divideResponse' /> <wsdl:fault message='typens:overflow' name='overflow' /> <wsdl:fault message='typens:overflow' name='overflow' /> </wsdl:operation> ... </wsdl:operation> ... <wsdl:binding name='ArithmeticsSoapBinding' type='impl:ArithmeticsEndPoint' > <wsdl:binding name='ArithmeticsSoapBinding' type='impl:ArithmeticsEndPoint' > <soap:binding ... <soap:binding ... <wsdl:operation ... <wsdl:operation ... <soap:body ... /> <soap:body ... /> <wsdl:fault> <wsdl:fault> <wsdlsoap:fault name="overflow" ... /> <wsdlsoap:fault name="overflow" ... /> </wsdl:fault> </wsdl:fault> </wsdl:operation> </wsdl:operation> School of Engineering © K. Rege, ZHAW 52 von 64 SOAP Aufrufe in Java ■ Definition eines Java APIs for XML-based RPC (JAX-WS) ■ Sun liefert Referenz-Implementation: Teil von J2EE JSR181 JSR181 Konkrete Implementation Config Config WSDL WSDL Client Client Generierte Generierte Stubs Stubs Server Server WSImport, WSGen JAX-WS JAX-WS Runtime Runtime HTTP HTTP JAX-WS JAX-WS Runtime Runtime HTTP HTTP Web WebServer Server School of Engineering © K. Rege, ZHAW 53 von 64 School of Engineering © K. Rege, ZHAW Erzeugen der Client Stub Klassen Klientenseitig : 1) Aufruf über generierten Stubs ■ Der Web Server bietet WSDL unter der URL http://localhost:8080/services?wsdl an ■ Statische Bindung an Service 54 von 64 ■ WSDL Service ⇒ Service Interface (-Service) Service Interface Implementation (-endpoint) ■ Stubs müssen mittels Kommandozeilen-Werkzeug erzeugt werden ■ Aufruf einfach ■ ■ directory directory ■ wsimport -d . -keep -p com.javatutor.insel.ws.gen.chrisws http://localhost:8081/services?wsdl 1) Instanziere Service 2) hole EndPoint Interface 3) rufe EndPoint Interface bzw. die implementierende Klasse DII Generierte Generierte Stubs Stubs JAX-WS JAX-WS Runtime Runtime WSDL WSDL HTTP HTTP Aus "Java ist auch eine Insel", Galileo Computing School of Engineering © K. Rege, ZHAW CalculatorService service = new CalculatorService(); CalculatorService service = new CalculatorService(); Calculator calc = service.getCalculatorEndPoint(); Calculator calc = service.getCalculatorEndPoint(); double d = calc.add(4,5); double d = calc.add(4,5); Client Client package der package der generierten generierten Klassen Klassen 55 von 64 School of Engineering wsimport WSDL WSDL public interface Calculator { public interface Calculator { public Calculator getCalculator(); public Calculator getCalculator(); ... ... } } public class CalculatorService { public class CalculatorService { public Calculator getCalculatorEndPoint() { public Calculator getCalculatorEndPoint() { ... ... } } . . . . . . } } © K. Rege, ZHAW 56 von 64 Klientenseitig : 2) Aufruf über DII JAX-WS mit (JSR181 Web Service Metadata) ■ Dynamic Invocation Interface : DII ■ Seit Java 6 in JDK integriert ■ Dynamischer Bindung an Service keine WSDL nötig ■ Definition der Web Service Schnittstelle einer annotierten Java Klasse ■ Aufruf wird mittels generischen Klassen Service und Call "von Hand" aufgebaut ■ Folgende Annotation in javax.ws und javax.ws.soap definiert ■ Selber verantwortlich, dass Reihenfolge, Anzahl und Typen der Argumente korrekt nur für einfache Beispiele geeignet, fehleranfällig ■ ■ ■ ■ import org.apache.axis.client.Call; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.client.Service; 1)Instanziere den 1)Instanziere den generischen Service generischen Service 2)Erzeuge 2)Erzeugegenerisches generisches Call CallObject Object String endpoint = "http://localhost:8080/axis/services/Calculator"; String endpoint = "http://localhost:8080/axis/services/Calculator"; String nameSpace = "http://localhost:8080/axis/Calculator"; String nameSpace = "http://localhost:8080/axis/Calculator"; Service service = new Service(); Service service = new Service(); ■ optional ■ Call call = (Call) service.createCall(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress( new java.net.URL(endpoint)); call.setTargetEndpointAddress( new java.net.URL(endpoint)); call.setOperationName(new javax.xml.namespace.QName(nameSpace, "add")); call.setOperationName(new javax.xml.namespace.QName(nameSpace, "add")); Object param = new Object[2]; Object param = new Object[2]; param[0] = new Double(4); param[0] = new Double(4); param[1] = new Double(5); param[1] = new Double(5); 3)Setze Adresse des 3)Setze Adresse des Services Services 4)Setze Namen 4)Setze Namen der Operation der Operation @WebService. Jede Web-Service-Implementierung muss diese Klassen-Annotation besitzen. Optionale Elemente sind zum Beispiel name (bestimmt den <wsdl:Interface>, Standard ist der unqualifizierte Name der Klasse bzw. Schnittstelle), targetNamespace, serviceName oder EndPointName. @SOAPBinding. Setzt den Stil der Nachrichten auf Dokument oder RPC. @WebMethod. Die Annotation macht eine Methode zur Web-Service-Operation. Der Standard-Name unter <wsdl:operation> ist der Name der Methode; er lässt sich mit dem Element operationName ändern. ■ ■ @WebParam. Beschreibt die Parameter genauer. Das Element name überschreibt den Parameternamen, der sonst »argX« heißen würde, für das WSDL-Element <wsdl:part>. @WebResult. Definiert die Rückgabe einer Web-Service-Methode genauer. @OneWay. Für asynchrone Aufrufe. 5)Konstruiere 5)Konstruiere Argumentliste: Object[] Argumentliste: Object[] Double ret = (Double) call.invoke(param); Double ret = (Double) call.invoke(param); Aus "Java ist auch eine Insel", Galileo Computing 6)Führe 6)FühreAufruf Aufrufaus aus School of Engineering © K. Rege, ZHAW 57 von 64 School of Engineering © K. Rege, ZHAW 58 von 64 Beispiel eines Servers Erzeugen der Server Klassen ■ Service ist einfache Java Klasse (POJO) ■ Die Timer Klasse enthält Implementation von Web Service package com.javatutor.insel.ws; package com.javatutor.insel.ws; import javax.jws.*; import javax.jws.*; import javax.jws.soap.*; import javax.jws.soap.*; oder oder@SOAPBinding(style @SOAPBinding(style==SOAPBinding.Style.DOCUMENT, SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL,parameterStyle=SOAPBinding.Paramet use=SOAPBinding.Use.LITERAL,parameterStyle=SOAPBinding.Paramet erStyle.BARE) erStyle.BARE) @WebService(name="BmiWebServices") @WebService(name="BmiWebServices") @SOAPBinding(style = SOAPBinding.Style.RPC) @SOAPBinding(style = SOAPBinding.Style.RPC) public class MyBmiWeb { public class MyBmiWeb { @WebMethod @WebMethod public String hello( String name ) public String hello( String name ) { { return "Hello " + name + "!"; return "Hello " + name + "!"; } } } ■ Versehene mit JSR 181 Annotationen WSDL 1.2 WSDL 1.2 ressource ressourceFiles Files wsgen -r . -extension -wsdl:Xsoap1.2 -cp . -keep timerservice.Timer @WebMethod(operationName="body-mass-index") @WebMethod(operationName="body-mass-index") @WebResult(name = "your-bmi") @WebResult(name = "your-bmi") public double bmi( @WebParam(name="height") double height, public double bmi( @WebParam(name="height") double height, @WebParam(name="weight") double weight ) @WebParam(name="weight") double weight ) { { double bmi = weight / (height * height) * 10000; double bmi = weight / (height * height) * 10000; System.out.println(this.getClass().getSimpleName()+" called:"+height+ " "+weight+" "+bmi); System.out.println(this.getClass().getSimpleName()+" called:"+height+ " "+weight+" "+bmi); return bmi; return bmi; } } Java Klasse Java Klasse } Aus "Java ist auch eine Insel", Galileo Computing School of Engineering © K. Rege, ZHAW Aus "Java ist auch eine Insel", Galileo Computing 59 von 64 School of Engineering © K. Rege, ZHAW 60 von 64 Veröffentlichung des WebServices Der Klient ■ In JSDK 1.6 ist auch ein Mini-WebServer integriert ■ Der Klient muss generierte Klassen importieren ■ Mittels Endpoint.publish wird der Service angemeldet package com.javatutor.insel.ws; package com.javatutor.insel.ws; import com.javatutor.insel.ws.gen.chrisws.BmiWebServices; import com.javatutor.insel.ws.gen.chrisws.BmiWebServices; import com.javatutor.insel.ws.gen.chrisws.MyBmiWebService; import com.javatutor.insel.ws.gen.chrisws.MyBmiWebService; package com.javatutor.insel.ws; package com.javatutor.insel.ws; public class MyBmiClient public class MyBmiClient { { public static void main( String[] args ) public static void main( String[] args ) { { import javax.swing.JOptionPane; import javax.swing.JOptionPane; import javax.xml.ws.Endpoint; import javax.xml.ws.Endpoint; public class PublishWsOnServer public class PublishWsOnServer { { public static void main( String[] args ) public static void main( String[] args ) { } } { String endpointUrl = "http://localhost:8081/services";; String endpointUrl = "http://localhost:8081/services";; Object service = new MyBmiWeb(); Object service = new MyBmiWeb(); Endpoint endpoint = Endpoint.publish(endpointUrl,service); Endpoint endpoint = Endpoint.publish(endpointUrl,service); JOptionPane.showMessageDialog( null, service.getClass().getSimpleName() JOptionPane.showMessageDialog( null, service.getClass().getSimpleName() +" started on "+ endpointUrl+"\nStop Service?"); +" started on "+ endpointUrl+"\nStop Service?"); endpoint.stop(); endpoint.stop(); } } BmiWebServices EndPoint = new MyBmiWebService().getBmiWebServicesEndPoint(); BmiWebServices EndPoint = new MyBmiWebService().getBmiWebServicesEndPoint(); System.out.printf( "%s Your BMI is %.1f%n", System.out.printf( "%s Your BMI is %.1f%n", EndPoint.hello( "Chris" ), EndPoint.hello( "Chris" ), EndPoint.bodyMassIndex( 183, 84 ) ); EndPoint.bodyMassIndex( 183, 84 ) ); } } } } Aus "Java ist auch eine Insel", Galileo Computing School of Engineering © K. Rege, ZHAW Aus "Java ist auch eine Insel", Galileo Computing 61 von 64 School of Engineering © K. Rege, ZHAW Zusammenfassung Referenzen, Links ■ Web Service ■ Liste verfügbarer Web Services: http://www.xmethods.com/ & http://www.webservicex.net ■ bietet Funktionen mittels Web-Technologie an ■ SOAP definiert Standardformat für Web Services, basierend auf XML ■ ■ Web Services & Java home - http://java.sun.com/j2ee/webservices/index.html Daneben eine Reihe von Diensten: UDDI, WS Security, WS Transaction ■ Java Web Services tutorial - http://java.sun.com/xml/docs.html#tutorials ■ SOAP Meldung besteht aus ■ Meist wird HTTP für den Transport verwendet ■ Java Web Services tutorial http://java.sun.com/webservices/docs/2.0/tutorial/doc/JAXWS3.html ■ Zur Beschreibung verwendet man WSDL ■ SOAP 1.1,1.2 - http://www.w3.org/TR/SOAP ■ ■ 62 von 64 Envelope, Header, Body (Fault) ■ Java ist auch eine Insel von Christian Ullenboom http://www.galileocomputing.de/openbook/javainsel6/ abstrakte Schnittstelle(Interface), Binding (EndPoint), Web Service ■ Java APIs for XML-based Communication: JAX-WS ■ JAX-WS als Teil des JDK 1.6 School of Engineering © K. Rege, ZHAW 63 von 64 School of Engineering © K. Rege, ZHAW 64 von 64