Web Service zur Aktienkursabfrage – Erläuterung der WSDL

Im Folgenden wird die WSDL-Datei des in dem Beispielprozess „Aktienkursabfrage“ verwendete Web Service  erläutert, mit dessen Hilfe die Aktienkurse von der New Yorker Börse abgefragt werden. Es handelt sich um einen relativ einfachen, im Internet öffentlich verfügbaren Web Service, der von der Firma Cloud Computing Technologies Ltd auf der Website www.webservicex.net angeboten wird. Die WSDL-Datei findet man unter

http://www.webservicex.net/stockquote.asmx?wsdl

Die Seite

http://www.webservicex.net/ws/WSDetails.aspx?CATID=2&WSID=9

enthält weitere Informationen zu diesem Service.

Im Folgenden werden die wichtigsten Ausschnitte aus der WSDL-Datei betrachtet. Im Kopf der Datei werden die verwendete XML-Version, die Zeichenkodierung und die verwendeten Namensräume und Präfixe beschrieben, die für eine eindeutige Benennung der verwendeten Elemente verwendet werden.

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" 
xmlns:tns="http://www.webserviceX.NET/" 
xmlns:s="http://www.w3.org/2001/XMLSchema" 
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
targetNamespace="http://www.webserviceX.NET/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">

In der letzten Zeile wird beispielsweise „wsdl“ als Präfix für „http://schemas.xmlsoap.org/wsdl“ festgelegt. Im Folgenden kann dann z. B. das Element „wsdl:message“ verwendet werden, das damit weltweit eindeutig definiert ist.

Falls man nun in derselben Datei auch noch Elemente aus einem anderen Standard verwenden möchte, die ebenfalls „message“ heißen, so kann man diese nicht einfach umbenennen, da Systeme, die diesen anderen Standard verwenden, die Datei dann nicht mehr automatisch verarbeiten könnten. Stattdessen bekommen die messages des anderen Standards eben einen Präfix, der sich auf eine andere URL bezieht, und können damit eindeutig von „wsdl:message“ unterschieden werden.

Im nächsten Abschnitt werden die für die Anfrage und die Antwort verwendeten Datenstrukturen definiert.

<wsdl:types>
    <s:schema elementFormDefault="qualified" 
                targetNamespace="http://www.webserviceX.NET/">
        <s:element name="GetQuote">
            <s:complexType>
                <s:sequence>
                    <s:element minOccurs="0" maxOccurs="1" 
                            name="symbol" type="s:string" />
                </s:sequence>
            </s:complexType>
        </s:element>
        <s:element name="GetQuoteResponse">
            <s:complexType>
                <s:sequence>
                    <s:element minOccurs="0" maxOccurs="1" 
                            name="GetQuoteResult" type="s:string" />
                </s:sequence>
            </s:complexType>
        </s:element>
        <s:element name="string" nillable="true" type="s:string" />
    </s:schema>
</wsdl:types>

Es ist eine Struktur mit zwei Elementen definiert: „GetQuote“ und „Get­Quote­Response“. „GetQuote“ enthält das Element „symbol“ vom Typ string, „GetQuote­Response“ enthält das Element „GetQuoteResult“, ebenfalls vom Typ string. „symbol“ und „GetQuoteResult“ können auch weggelassen werden (minOccurs=“0“) und dürfen maximal einmal vorkommen (maxOccurs=“1“).

Mit Hilfe von Elementen wie „complexType“ und „sequence“ lassen sich komplexere Datenstrukturen definieren. Hier besteht jeder „komplexe“ Typ nur aus genau einer „Sequenz“, die wiederum nur ein Element enthält.

Als nächstes werden die von dem Service empfangenen bzw. gesendeten Nachrichten (messages) festgelegt. Hierbei werden die oben definierten Elemente „GetQuote“ und „Get­Quote­Response“ als Parameter verwendet:

<wsdl:message name="GetQuoteSoapIn">
    <wsdl:part name="parameters" element="tns:GetQuote" />
</wsdl:message>
<wsdl:message name="GetQuoteSoapOut">
    <wsdl:part name="parameters" element="tns:GetQuoteResponse" />
</wsdl:message>

Da der Service verschiedene Nachrichtenformate unterstützt (HttpGet, HttpPost und SOAP1.2), folgen in der Datei noch weitere Nachrichten-Definitionen für diese anderen Formate. Diese werden hier wie in den weiteren Erläuterungen nicht weiter betrachtet, da das SOAP-Protokoll verwendet werden soll.

Die eigentliche logische Schnittstelle mit ihren Operationen wird in WSDL als „portType“ bezeichnet. Im folgenden Abschnitt wird ein portType „StockQuoteSoap“ definiert. Er verfügt über eine Operation „GetQuote“, die wiederum die oben definierten Nachrichten als Input und Output verwendet.

<wsdl:portType name="StockQuoteSoap">
    <wsdl:operation name="GetQuote">
        <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
             Get Stock quote for a company Symbol
        </wsdl:documentation>
        <wsdl:input message="tns:GetQuoteSoapIn" />
        <wsdl:output message="tns:GetQuoteSoapOut" />
    </wsdl:operation>
</wsdl:portType>

Es folgt die Definition des „Binding“. Hier wird für den obigen portType festgelegt, dass die SOAP-Nachrichten über das http-Protokoll übertragen werden. Für den genauen Aufbau der eigentlichen Nachrichten gibt es verschiedene Möglichkeiten, die über die Angaben von „style“ und „use“ bestimmt werden.

<wsdl:binding name="StockQuoteSoap" type="tns:StockQuoteSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="GetQuote">
        <soap:operation soapAction="http://www.webserviceX.NET/GetQuote" 
                style="document" />
        <wsdl:input>
            <soap:body use="literal" />
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal" />
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>

Schließlich folgt die eigentliche Beschreibung des Service. Hier wird das obige Binding einem konkreten Port zugeordnet, d. h. einer echten Web-Adresse, über die der Service erreichbar ist.

    <wsdl:service name="StockQuote">
        <wsdl:port name="StockQuoteSoap" binding="tns:StockQuoteSoap">
            <soap:address 
                location="http://www.webservicex.net/stockquote.asmx" />
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

Damit ist der Web Service vollständig beschrieben.