SOAP & WSDL


Simple Object Access Protocol

SOAP + JAXM
SOAP Prozessmodell und SOAP - JAXM Zusammenarbeit
(Quelle: JAXM Spec)

'Historie':

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

Arten von SOAP Nachrichten

 

SOAP Nachrichten

verwendete Namensräume

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

SOAP Envelope

SOAP (einfach)
SOAP ohne Attachments
(Quelle: JAXM Spec)

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>

das SOAP-Fault Element

   <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:

SOAP Encoding

SOAP für RPC

Funktionsaufrufe werden im SOAP-Body als zusammengesetzter Datentyp übertragen.

z.B.

  <methodName>
    <arg1Name>3</arg1Name>
    <arg2Name>5</arg2Name>
    <arg3Name>7</arg3Name>
  </methodName>

SOAP mit Attachments

SOAP (mit Attachments)
SOAP mit Attachments (Quelle: JAXM Spec)

JAXM: Java API for XML Messaging

Unterstützt SOAP und SOAP mit Attachments.

Unterstützt ebXML: e-bussines-XML.

SOAP + JAXM
SOAP - JAXM Zusammenarbeit
(Quelle: JAXM Spec)

Web Service Description Language (WSDL)

WSDL Konzepte
Übersicht über WSDL Konzepte

Was bietet der Web-Service ?

Wie werden die Informationen Transportiert ?

Wo befindet sich der Web-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>

Definition der Datentypen

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>

Definition der Nachrichten

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>

Definition der Operationen

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>

Bindungen zwischen Definitionen und Transport

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>

Services und Ports

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>

WSDL - SOAP Bindungselemente

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>

WSDL - HTTP Bindungselemente

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 />

WSDL - MIME Bindungselemente

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.


Ausblick


© Universität Mannheim, Rechenzentrum, 1998-2007.

Heinz Kredel

Last modified: Sun Jun 3 19:51:53 CEST 2007