Simple Object Access Protocol
SOAP Nachrichten
SOAP Encoding
SOAP und RPC
SOAP Attachments
Web Service Description Language
WSDL Datentypen
WSDL Nachrichten
WSDL Porttypes
WSDL Binding
WSDL Service und Port
WSDL - SOAP Binding
Protokoll zum Informationsaustausch (im Web)
Inhalt der Information wird per XML beschrieben
Transport der Information wird per HTTP oder HTTP-EF erledigt
Vorteil: Strukturierte XML-Daten anstelle von binären MIME-Daten
'Historie':
SOAP 1.0 von MS
SOAP 1.1 ist W3C Note vom 8. Mai 2000
SOAP Attachments ist jetzt SOAP 1.2
SOAP 1.2 ist W3C Recommendation vom 24. Juni 2003
Bestandteile:
Beispiel: Hallo SOAP Server
POST /HalloServer HTTP/1.1 Host: www.hallo-welt.com Content-Type: text/xml; charset="utf-8" Content-Length: nnnn SOAPAction: "ein URI" <SOAP-ENV:Envelope xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:GetGreeting xmlns:m="ein NS-URI"> <myName>Heinz Kredel</myName> </m:GetGreeting> </SOAP-ENV:Body> </SOAP-ENV:Envelope>In SOAP 1.2:
POST /HalloServer HTTP/1.1 Host: www.hallo-welt.com Content-Type: application/soap+xml; action="ein URI"; charset="utf-8" Content-Length: nnnn ...
Beispiel: Antwort vom SOAP Server
HTTP/1.1 200 OK Content-Type: text/xml; charset="utf-8" Content-Length: nnnn <SOAP-ENV:Envelope xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"/> <SOAP-ENV:Body> <m:getGreetingResponse xmlns:m="ein NS-URI"> <message>Hallo Heinz Kredel!</message> </m:GetGreetingResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Transport in HTTP
SOAP 1.1:
neuer HTTP Header SOAPAction: [action-URI]
Content-Type ist text/xml
SOAP 1.2:
Content-Type ist application/soap+xml
mit optionalem Attribut action=[action-URI]
bei SOAP Fehler muss auch ein HTTP Fehler 500
erzeugt werden und ein Fault
-Element muss in der
Antwort enthalten sein
Arten von SOAP Nachrichten
einfache SOAP Nachrichten
SOAP Nachrichten mit Attachments
verwendete Namensräume
xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC = "http://schemas.xmlsoap.org/soap/encoding/"
SOAP Nachrichten dürfen keine DTDs (Document Type Definitions) und keine PIs (Processing Instruction) enthalten
Ein SOAP-Processor (Empfänger) muss in der Lage sein
alle Teile einer SOAP Nachricht zu identifizieren.
Versteht er einige Teile nicht muss er die Nachricht verwerfen.
Ist der Inhalt nicht für ihn, muss er seine Teile entfernen und den Inhalt weiterleiten.
eine SOAP Nachricht ist/besteht aus einem SOAP-Envelope
ein SOAP-Envelope besteht aus einem (optionalen) SOAP-Header und einem SOAP-Body, danach dürfen weitere (nicht-SOAP) XML-Elemnte folgen
der SOAP-Header dient zur Angabe von speziellen Eigenschaften des SOAP-Bodies
der SOAP-Body enthält die eigentliche Nachricht für den (nächsten) Empfänger
es gibt einen default SOAP-Body für Fehlermeldungen: SOAP-ENV:Fault
der (optionale) Inhalt von SOAP-Header muss mit den richtigen Namensräumen versehen sein
der Inhalt von SOAP-Body kann(?) mit entsprechenden Namensräumen versehen sein
XML-ELemente nach SOAP-Body müssen mit den richtigen Namensräumen versehen sein
alle SOAP Elemente können ein encodingStyle
Attribut haben
weitere Attribute für den Inhalt der Header und des Body:
actor = "URI"
definiert den Empfänger
des Elements
mustUnderstand = "1"
verlangt, dass der Empfänger die Bedeutung des Elements
voll versteht, falls nicht, wird die Nachricht verworfen
allgemeinste Form eines SOAP-Envelopes
<SOAP-ENV:Envelope xmlns:SOAP-ENV = "NS-URI" encodingStyle = "NS-URI" > <SOAP-ENV:Header> Header Inhalt </SOAP-ENV:Header> <SOAP-ENV:Body> Body Inhalt </SOAP-ENV:Body> <xxx:other xmlns:xxx = "NS-URI" > anderer Inhalt </xxx:other> </SOAP-ENV:Envelope>
<SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>SOAP-ENV:Server</faultcode> <faultstring>Beschreibung</faultstring> <faultactor>actor-URI</faultactor> <detail> <e:message xmlns:e="ein NS-URI"> Kann das Element xxx nicht verarbeiten. </e:message> </detail> </SOAP-ENV:Fault> </SOAP-ENV:Body>
Fehler-Codes in faultcode
sind analog zu
HTTP 1xx, 2xx, 3xx, 4xx, 5xx Codes:
versionMismatch
:
Namensräume passen nicht
mustUnderstand
:
kann ein solches Element nicht verstehen
Client
:
die Anfrage war Fehlerhaft,
hatte nicht die korrekte Authentifizierung, etc.
Server
:
der Server konnte die Nachricht nicht verarbeiten
oder weiterleiten
ein einfaches Typ-System zur Beschreibung der übertragenen Daten
alles was mit XML Schema definierbar ist kann übertragen werden
verwendete Schema Namensräume
xmlns:xsd = "http://www.w3.org/1999/XMLSchema"
xmlns:xsi = "http://www.w3.org/1999/XMLSchema-instance"
im Zweifelsfall oder für bessere Effizienz können entsprechende 'SOAP-ENC' Attribute den Typ genauer beschreiben
einfache Datentypen: int, float, String, Enumeration, Byte Arrays; z.B.
<betrag xsi:type="xsd:float">29.95</betrag>oder auch nur
<betrag>29.95</betrag>
zusammengesetzte Datentypen: Struct, Array; z.B.
<zahlenFeld SOAP-ENC:arrayType="xsd:int[2]"> <zahl>3</zahl> <zahl>5</zahl> </zahlenFeld>
Funktionsaufrufe werden im SOAP-Body als zusammengesetzter Datentyp übertragen.
z.B.
<methodName> <arg1Name>3</arg1Name> <arg2Name>5</arg2Name> <arg3Name>7</arg3Name> </methodName>
Unterstützt SOAP und SOAP mit Attachments.
Unterstützt ebXML: e-bussines-XML.
WSDL 1.0 von Microsoft
WSDL 1.1 ist W3C Note vom 15. März 2001
WSDL 2.0 ist beim W3C in Arbeit
Proposed Recommendations vom Mai 2007
Interface Definition von Web-Services
ähnlich wie Java Interfaces oder CORBA IDLs
kann RPC- oder Message-artige Schnittstellen beschreiben
Beschreibung durch XML-Dokumente
Was bietet der Web-Service ?
Definition der Datentypen durch XML-Schema
Beschreibung von Nachrichten-Typen durch Komposition aus Folgen von Datentypen
Beschreibung von Operationen durch Kompositon von Nachrichten-Typen
Zusammenfassung von Operationen zu Service-Schnittstellen (PortTypes genannt)
entspricht etwa einer Java interface
oder
CORBA IDL interface
Definition
Wie werden die Informationen Transportiert ?
Binden der Operationen an Übertragungsprotokolle (z.B. SOAP, HTTP, Mime/SMTP)
Binden der Nachrichten an Übertragungsmechanismen und (Transport-)Kodierungen
ist bei Java z.B. RMI, Sockets, JMS, bei CORBA z.B. IIOP
Wo befindet sich der Web-Service ?
Definition des Web-Service durch Ports mit Transportmethode und URL
ist bei Java z.B. rmi:
-URL und RMI-Registry,
bei CORBA z.B. IOR:
-URL und Naming-Service
Grundaufbau einer Web-Service Definition:
<wsdl:definitions xmlns:wsdl=url > <wsdl:types > XML Schema Definitionen </wsdl:types> <wsdl:message name=n > Nachrichtentypen </wsdl:message> <wsdl:portType name=n > Operationen </wsdl:portType> <wsdl:binding name=n > Protokolle und Encoding </wsdl:binding> <wsdl:service name=n > Port und URL </wsdl:service> </wsdl:definitions>
Es können eigene Datentypen definiert werden und es können alle Datentypen von XML Schema verwendet werden.
<wsdl:types > <xsd:schema > <xsd:complexType name=n > ... </xsd:complexType> <xsd:simpleType name=n > ... </xsd:simpleType> ... </xsd:schema > </wsdl:types>
Beispiel zur Definition eines String-Feldes:
<wsdl:types> <schema targetNamespace="http://localhost:8080/axis/CarStore.jws" xmlns="http://www.w3.org/2001/XMLSchema"> <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <complexType name="ArrayOf_xsd_string"> <complexContent> <restriction base="soapenc:Array"> <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/> </restriction> </complexContent> </complexType> </schema> </wsdl:types>
Eine Nachricht ist eine Folge aus einzelnen Datentypen, die durch Parts definiert werden. Eine Nachricht entspricht etwa einem Parameter bei einem Methodenaufruf.
<wsdl:message name="n"> <wsdl:part name="p" element="tns:name"/> <wsdl:part name="p" type="xsd:type"/> </wsdl:message>
Beispiel zur Definition der Nachrichten der folgenden
Methode String getCar( int i )
:
<wsdl:message name="getCarRequest"> <wsdl:part name="iCar" type="xsd:int"/> </wsdl:message> <wsdl:message name="getCarResponse"> <wsdl:part name="getCarReturn" type="xsd:string"/> </wsdl:message>
Operationen werden innerhalb des portType Elements definiert. Für jede Operation werden Ein- und Ausgabe Paramenter definiert. Es werden folgende 4 Arten unterschieden: One-way, Request-response, Solicit-response, Notification.
<wsdl:portType name="n"> <wsdl:operation name="oneWay" > <wsdl:input message="impl:n" name="n"/> </wsdl:operation> <wsdl:operation name="reqRes" > <wsdl:input message="impl:n" name="n"/> <wsdl:output message="impl:n" name="n"/> </wsdl:operation> <wsdl:operation name="solRes" > <wsdl:output message="impl:n" name="n"/> <wsdl:input message="impl:n" name="n"/> </wsdl:operation> <wsdl:operation name="not" > <wsdl:output message="impl:n" name="n"/> </wsdl:operation> </wsdl:portType>
Beispiel zur Definition der Operation, die folgender
Methode String getCar( int i )
entspricht:
<wsdl:portType name="CarStore"> <wsdl:operation name="getCar" parameterOrder="iCar"> <wsdl:input message="impl:getCarRequest" name="getCarRequest"/> <wsdl:output message="impl:getCarResponse" name="getCarResponse"/> </wsdl:operation> </wsdl:portType>
Mit Hilfe des Binding-Elements wird definiert wie die portTypes über das Netz transportiert und kodiert werden. In WSDL 1.1. sind folgende Transportarten beschrieben: SOAP, direkt mit HTTP GET / POST oder mit Mime / SMTP. Transportstile sind: RPC oder Message / Document.
Mit dem WSDL-SOAP Binding ergibt sich folgender Aufbau:
<wsdl:binding name="nBinding" type="impl:"> <wsdlsoap:binding style="rpc" transport=url /> <wsdl:operation name="nN"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="getCarRequest"> <wsdlsoap:body encodingStyle=url namespace=url use=u /> </wsdl:input> <wsdl:output name="nN"> <wsdlsoap:body encodingStyle=url namespace=url use=u /> </wsdl:output> <wsdl:fault name="nN"> <wsdlsoap:body encodingStyle=url namespace=url use=u /> </wsdl:fault> </wsdl:operation> </wsdl:binding>
Beispiel für das Binding zur Operation, die folgender
Methode String getCar( int i )
entspricht:
<wsdl:binding name="CarStoreSoapBinding" type="impl:CarStore"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getCar"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="getCarRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded"/> </wsdl:input> <wsdl:output name="getCarResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/CarStore.jws" use="encoded"/> </wsdl:output> </wsdl:operation> </wsdl:binding>
Mit Hilfe des Service-Elements werden verschiedene (Kommunikations-) Endpunkte gruppiert. Ein Endpunkt wird durch ein Port-Element definiert. Der Port stellt die Beziehung zwischen der Bindung und dem URL der Service-Implementierung her.
Mit dem WSDL-SOAP Binding ergibt sich folgender Aufbau:
<wsdl:service name="nS"> <wsdl:port binding="impl:nB" name="nN"> <wsdlsoap:address location=url /> </wsdl:port> </wsdl:service>
Beispiel für den Service der einen Autospeicher bereitstellt. Der Autospeicher nutzt die Apache Axis Implementierung von SOAP.
<wsdl:service name="CarStoreService"> <wsdl:port binding="impl:CarStoreSoapBinding" name="CarStore"> <wsdlsoap:address location="http://localhost:8080/axis/CarStore.jws"/> </wsdl:port> </wsdl:service>
Die WSDL-SOAP Bindungselemente werden in den entsprechenden WSDL Elementen eingefügt und definieren wie die Elemente in SOAP zu interpretieren sind.
Die wichtigsten Elemente (mit wsdlsoap
Namensraum) sind:
<wsdlsoap:binding style="rpc|document" transport="soap/{http,ftp,smtp}" /> <wsdlsoap:operation soapAction="http header" /> <wsdlsoap:body encodingStyle=url namespace=url use="literal|encoded" /> <wsdlsoap:header message="qname" encodingStyle=url namespace=url use="literal|encoded" /> <wsdlsoap:headerfault message="qname" encodingStyle=url namespace=url use="literal|encoded" /> <wsdlsoap:fault name="qname" encodingStyle=url namespace=url use="literal|encoded" /> <wsdlsoap:address location=url />
Beispiel für eine SOAP Anfrage und Antwort aus dem
Autospeicher Web-Service.
Die SOAP Anfrage nach der getCar
Operation:
<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <getCar soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <arg0 xsi:type="xsd:int">2</arg0> </getCar> </soapenv:Body> </soapenv:Envelope>
Der Web Service antwortet mit folgender SOAP Nachricht
<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <getCarResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <getCarReturn xsi:type="xsd:string">BMW</getCarReturn> </getCarResponse> </soapenv:Body> </soapenv:Envelope>
Die WSDL-HTTP Bindungselemente werden in den WSDL Elementen (binding, operation und address) eingefügt und definieren wie die Elemente im HTTP Protokoll zu interpretieren sind.
Die wichtigsten Elemente (mit wsdlhttp
Namensraum)
sind:
<wsdlhttp:binding verb="GET|POST" /> <wsdlhttp:operation location=relative-url /> <wsdlhttp:urlReplacement /> <wsdlhttp:address location=absolute-url />
Die WSDL-MIME Bindungselemente werden in WSDL Elementen (input und output) eingefügt und definieren wie die Elemente als MIME Dokumente zu interpretieren sind.
Die wichtigsten Elemente
(mit wsdlmime
Namensraum)
sind:
<wsdlmime:content part="n" type="type/subtype" /> <wsdlmime:multipartRelated > <wsdlmime:part> <wsdlmime:content type="type/subtype" /> </wsdlmime:part> <wsdlmime:part> <wsdlsoap:body part="n" use="u" /> </wsdlmime:part> </wsdlmime:multipartRelated> <wsdlmime:mimeXmlcontent part="n" />
In der WSDL Spezifikation wird eine XML Schema Definition aller Elemente und Bindungs-Elemente angegeben.
Universal Description Discovery and Integration (UDDI)
Verzeichnisdienst
Grid Services im Grid Computing
Grid-WSDL (GWSDL)
© Universität Mannheim, Rechenzentrum, 1998-2007.
Heinz KredelLast modified: Sun Jun 3 19:51:53 CEST 2007