WebServices: Kommunikation
WS Basiskomponenten & Rollen SOAP XML-RPC SOAP XML-RPC
WS-Kommunikations Paradigmen Kommunikation nicht an bestimmte Level5-Protokolle gebunden Üblicherweise jedoch: SOAP XML-RPC Kommunikation ebenfalls nicht an bestimmte Transport- Protokolle gebunden! HTTP JMS Partner müssen sich vorher auf Protokolle geeinigt haben
Kommunikation: RPC vs. Document-Style Document-Style Aufruf eines Dienstes Ergebnis: Dokument/Datei Vergleichbar mit Browser RPC: Remote Procedure Call Funktionsaufrufe bei entfernten Maschinen/Diensten Liefern in der Regel ein Ergebnis zurück
XML-RPC Einfaches Protokoll für entfernte Funktionsaufrufe über HTTP Knappe Spezifikation XML als Payload in HTTP Codierung der Übergabeparameter Request-Response-Prinzip Request via HTTP-POST
XML-RPC: Request Beispiel POST /RPC2 HTTP/1.0 User-Agent: Frontier/5.1.2 (WinNT) Host: calcservice.example.com Content-Type: text/xml Content-length: 181 <?xml version="1.0"?> <methodcall> <methodname>calculator.add</methodname> <params> <param> <value><int>41</int></value> </param> <param> <value><int>10</int></value> </param> </params> </methodcall>
XML-RPC: Request Anforderungen HTTP Header: Content-type = text/xml Content-Length muss angegeben sein HTTP Payload: XML-Dokument Eine einzige <methodcall> Struktur <methodcall> muss <methodname> enthalten <params> <param> <value> <Datentyp> Wert
XML-RPC: Datentypen 1 <string>: Defaultdatentyp <i4>, <int>: 4byte signed integer <boolean> <double> <datetime.iso8601>: z.b. 20080717T14:08:55 <base64>
XML-RPC: Datentypen 2 - Arrays <array> <data> <value><i4>12</i4></value> <value><string>egypt</string></value> <value><boolean>0</boolean></value> <value><i4>-31</i4></value> </data> </array>
XML-RPC: Datentypen 3 - Structs <struct> <member> <name>lowerbound</name> <value><i4>18</i4></value> </member> <member> <name>upperbound</name> <value><i4>139</i4></value> </member> </struct>
XML-RPC: Response Beispiel HTTP/1.1 200 OK Connection: close Content-Length: 158 Content-Type: text/xml Date: Fri, 17 Jul 1998 19:55:08 GMT Server: UserLand Frontier/5.1.2-WinNT <?xml version="1.0"?> <methodresponse> <params> <param> <value><int>51</int></value> </param> </params> </methodresponse>
XML-RPC: Response Format HTTP Header: Wenn keine überliegenden Fehler: Response-Code = 200 OK Content-type: text/xml Payload:
XML-RPC: Vor- und Nachteile Vorteile: Geringe Komplexität Einfache Umsetzung von RPCs Nachteile Keine Schnittstellenbeschreibung keine lose Kopplung Keine Namespaces Wenige Datentypen Direkt an HTTP gebunden
SOAP Früher: SOAP v1.1 Simple Object Access Protocol Heute: SOAP v1.2 Kein Akronym mehr W3C-Recommondation http://www.w3c.org/tr/soap Unterteilung: SOAP v1.2 Part 0: Primer SOAP v1.2 Part 1: Messaging Framework SOAP v1.2 Part 2: Adjuncts
SOAP Bindings Spezifikation darüber, wie SOAP in Protokolle der unterliegenden OSI Layer eingebracht werden kann In SOAP 1.2 Part 2: Lediglich HTTP Binding definiert Weitere Bindings über Eigendefinitionen möglich Es exisitieren im Netz weitere Bindings (z.b. SOAPover-SMTP), die jedoch nicht standardisiert sind!
SOAP Aufbau SOAP = SOAP Env. Header Optional Kann Applikationsspezifische Metadaten aufnehmen Sicherheitsinformationen Body Payload
SOAP 1.2 XSD
SOAP Beispiel Nachricht I (RPC Request) <?xml version="1.0"?> <env:envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:header> <t:transaction xmlns:t="http://thirdparty.example.org/transaction" env:encodingstyle="http://example.com/encoding" env:mustunderstand="true">5</t:transaction> </env:header> <env:body> <m:add env:encodingstyle="http://www.w3.org/2003/05/soap-encoding" xmlns:m="http://calculator.example.org/"> <m:summand>41</m:summand> <m:summand>10</m:summand> </m:add> </env:body> </env:envelope>
SOAP Beispiel Nachricht II (RPC Response) <?xml version="1.0"?> <env:envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:header> <t:transaction xmlns:t="http://thirdparty.example.org/transaction" env:encodingstyle="http://example.com/encoding" env:mustunderstand="true">5</t:transaction> </env:header> <env:body> <m:addresponse env:encodingstyle="http://www.w3.org/2003/05/soap-encoding" xmlns:rpc="http://www.w3.org/2003/05/soap-rpc"> xmlns:m="http://calculator.example.org/"> <rpc:result>m:sum</rpc:result> <m:sum>51</m:sum> </m:addresponse> </env:body> </env:envelope>
SOAP Beispiel Nachricht III (Conversational) <?xml version="1.0"?> <env:envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:header> <m:reservation xmlns:m="http://travelcompany.example.org/reservation" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:mustunderstand="true"> <m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference> <m:dateandtime>2001-11-29t13:35:00.000-05:00</m:dateandtime> </m:reservation> <n:passenger xmlns:n="http://mycompany.example.com/employees" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:mustunderstand="true"> <n:name>åke Jógvan Øyvind</n:name> </n:passenger> </env:header> <env:body> <p:itineraryclarification xmlns:p="http://travelcompany.example.org/reservation/travel"> <p:departure> <p:departing> <p:airportchoices>jfk LGA EWR</p:airportChoices> </p:departing> </p:departure> <p:return> <p:arriving> <p:airportchoices>jfk LGA EWR</p:airportChoices> </p:arriving> </p:return> </p:itineraryclarification> </env:body> </env:envelope>
SOAP Fault Überträgt spezifiziert Fehlermeldungen in einer SOAP Nachricht Definiert als erstes Kindelement innerhalb von env:body Struktur: siehe Schema nächste Folie
SOAP Fault
SOAP Fault Beispiel <?xml version="1.0"?> <env:envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:rpc="http://www.w3.org/2003/05/soap-rpc"> <env:body> <env:fault> <env:code> <env:value>env:sender</env:value> <env:subcode> <env:value>rpc:badarguments</env:value> </env:subcode> </env:code> <env:reason> <env:text xml:lang="en-us">processing error</env:text> <env:text xml:lang="de-de">verarbeitungsfehler</env:text> </env:reason> <env:detail> <e:myfaultdetails xmlns:e="http://example.org/faults"> <e:message>invalid Application-ID</e:message> <e:errorcode>999</e:errorcode> </e:myfaultdetails> </env:detail> </env:fault> </env:body> </env:envelope>
SOAP Fault Fault Codes VersionMismatch MustUnderstand DataEncodingUnknown Sender Receiver
SOAP Processing Modell - Nodes Ursprünglicher Absender (initial SOAP sender) Zwischenstation (SOAP Intermediary) Endgültiger Empfänger (ultimate SOAP Receiver/Recipient)
SOAP Processing Modell - Rollen In Headerblöcken als Attribut env:role über URIs definiert none next ultimatereceiver Benutzerdefinierte URIs Schreiben Verarbeitungsweise der Infoblöcke vor Knoten Rolle Fehlt none next ultimate Receiver Zwischenstation Endgültiger Empfänger
SOAP Processing Modell Infoblöcke im Header können als MUSS Verarbeitung festgelegt werden Mittels Attribut env:mustunderstand Wenn Attribut=false oder fehlt, optionale Verarbeitung möglich Wenn Verarbeitung nicht möglich SOAP Fault
SOAP Fault Beispiel Processing Fehler <?xml version='1.0'?> <env:envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:header> <env:notunderstood qname="t:transaction" xmlns:t="http://thirdparty.example.org/transaction"/> </env:header> <env:body> <env:fault> <env:code> <env:value>env:mustunderstand</env:value> </env:code> <env:reason> <env:text xml:lang="en-us">header not understood</env:text> </env:reason> </env:fault> </env:body> </env:envelope>
SOAP Processing Modell Weiterleitung von Header-Blöcken Definiert durch optionales env:relay Attribut im Header-Block Trifft nur zu für SOAP-Intermediäre Trifft nur zu wenn mustunderstand!= true Hintergrund: Standardverhalten von SOAP Intermediären: Entfernung von allen nicht verarbeiteten Header-Blöcken vor Weiterleitung der Nachricht
SOAP Weiterleitung Rolle Header Block Name Eingenommen Verstanden & Verarbeitet next Benutzer-definiert ultimatereceiver Ja Ja Ja Nein Ja Nein Nein - Ja Ja Ja - Nein - none Nein - Ja Weiterleitung Nein* Wenn relay= true Nein* Wenn relay= true *: es sei denn, Header-Block durch Verarbeitung neu eingefügt
SOAP Weiterleitung - Beispiel <env:envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:header> <p:oneblock xmlns:p="http://example.com" env:role="http://example.com/log" env:mustunderstand="true">...... </p:oneblock> <q:anotherblock xmlns:q="http://example.com" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:relay="true">...... </q:anotherblock> <r:athirdblock xmlns:r="http://example.com">...... </r:athirdblock> </env:header> <env:body>...... </env:body> </env:envelope> Muss-Verarbeitung Optionale Neueinspeisung des Blocks Keine Weiterleitung, wenn nicht verarbeitet Weiterleitung auf jeden Fall, auch wenn keine Verarbeitung stattfindet bzw. der Knoten den Block nicht versteht
SOAP Processing Modell SOAP Processing Steps: 1. Rollen-Ermittlung, die ein Knoten einnimmt 2. Identifizierung aller obligatorischen Header-Blöcke, die an den Knoten gerichtet sind 3. Falls Blöcke aus (2) nicht verarbeitbar sind SOAP Fault und keine weitere Verarbeitung 4. Verarbeitung aller obligatorischen und ggf. optionaler Header-Blöcke, die an den Knoten gerichtet sind. Wenn Knoten = ultimatereceiver, dann auch env:body verarbeiten 5. Wenn Knoten = Intermediary, dann Weiterleitung der Nachricht (unter Beachtung von Header-Blöcken)
SOAP Adressierung Durch Transportprotokoll geregelt i.d.r. wird ein Service-Endpunkt mittels einer URL benannt SOAP-Dispatcher Schaffung einer WS übergreifenden Adressierungs- Spezifikation WS-Adressing (W3C Submission)
SOAP-Adressierungs- und Verarbeitungs- Problematik bei SOAP-Dispatcher SOAP Methoden-Name erst innerhalb des SOAP-Bodys UltimateReceiver muss komplette SOAP-Nachricht parsen, bevor er den eigentlichen Dienst aufrufen kann Bsp: UltimateReceiver = ShopSystem-Service Erreichbar über URL http://example.com/exampleshop (SOAP Dispatcher) Funktionen: getarticlelist() getarticle() order() Alle Funktionen sind über gleiche URL mittels SOAP Nachrichten anzusprechen, Dispatcher entscheidet anhand des SOAP-Bodys, welche Service-Funktion gewählt werden soll Nachteil: Erhöhte Verarbeitungsdauer; keine eindeutige, funktions- bzw. Ressourcen-orientierte Adressierung möglich Vorteil: Für WS-Konsumenten ist nur ein Endpunkt sichtbar
SOAP-Dispatcher SOAP envelope Request (XML doc) HTTP POST URL 1 getarticlelist() Response (XML doc) HTTP Response Request (XML doc) Response (XML doc) order (XML doc) HTTP POST HTTP POST URL 1 HTTP Response URL 1 Web Server SOAP Server getarticle(id) submit(order) Response (XML doc) HTTP Response
SOAP-Dispatcher HTTP POST getarticlelist() HTTP POST URL 1 SOAP Server getarticle(id) HTTP POST submit(order)
SOAP HTTP Binding Bei Request-Response Message Exchange Pattern: HTTP POST Bei Response Message Exchange Pattern: HTTP GET Bei Faults: HTTP Status Code 500 Internal Server Error mit SOAP Fault als Payload
SOAP-HTTP Binding und Adressierung SOAP 1.2 erlaubt Benennung der auszuführenden Methode (SOAP Action) auch außerhalb des SOAP- Payloads Beispiel Client: POST /exampleshop/exampleservice HTTP/1.1 SOAPAction: "getarticlelist" <?xml version='1.0' encoding='utf-8'?> <env:envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:body /> </env:envelope>
SOAP Vor- und Nachteile Vorteile: Hoher Spezifizierungsgrad & aktuelle Weiterentwicklung Unterstützung Namespaces Spezifizierte APIs Ermöglicht Loose Kopplung Nicht nur RPC durchführbar Keine harte Bindung an HTTP Trennung von Nutzdaten und Metadaten Multi-Hop-fähig Nachteile Relativ komplex (im Vergleich zu XML-RPC)
REST REpresentational State Transfer Hervorgegangen aus R. Fieldings Ph.D. Dissertation beschreibt einen Architekturstil von Netzwerksystemen REST ist kein Standard/Spezifikation Empfiehlt jedoch den Einsatz von einigen Standards: HTTP, URL, XML/HTML/GIF/JPEG/etc.
REST Client: Zugriff mittels Links auf Ressourcen des Server Antwort des Servers: Representation of the applications state Zugriff/Links: state transitions Zielsystem/Server/Service/Anwendung: state machine State-Transitions eng an HTTP-Methoden gebunden Interaktionen sind zustandslos
REST: HTTP Methoden HTTP GET: Abrufen einer Ressource HTTP POST: Erstellung einer neuen Ressource HTTP PUT: Aktualisierung einer Ressource HTTP DELETE: Löschen einer Ressource
REST: Ressourcen Ressourcen identifiziert mittels URIs Repräsentation des Ressourcen-Inhalt nicht festgelegt Anwendungsabhängig, i.d.r. jedoch HTML, XML, o.ä. Ressourcen können Verweise auf weitere (Folge-) Ressourcen enthalten
REST: Beispiel HTTP GET request URL 1 Response (HTML/XML doc) HTTP response Article List HTTP GET request URL 2 Response (HTML/XML doc) HTTP response Web Server Article Order HTTP POST URL 3 (HTML/XML) URL zur übermittelten Bestellung HTTP response Order
REST: Beispiel [Schritt 1: Artikelliste abrufen] Client: GET /shopsystem/articlelist HTTP/1.1 Server-Antwort: HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 <?xml version="1.0" encoding="utf-8"?> <al:articlelist xlmns:al= urn:example.org:shopsystem:alist xlmsn:xlink= http://www.w3.org/1999/xlink > <al:article id= 01 xlink:href= http://example.org/shopsystem/article/01 /> <al:article id= 02 xlink:href= http://example.org/shopsystem/article/02 /> </al:articlelist>
REST: Beispiel [Schritt 2: Artikel abrufen] Client: GET /shopsystem/article/01 HTTP/1.1 Server-Antwort: HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 <?xml version="1.0" encoding="utf-8"?> <a:article a:id= 01 xlmns:a= urn:example.org:shopsystem:article > <a:name> </a:name> <a:details> </a:details> </a:article>