Webservices: Teil 1 - WSDL
Eine leere WSDL Datei
Eine WSDL Datei ist nichts anderes als eine XML Datei. Sie definiert unsere Schnittstelle. In ihr steht wo unser Service zu finden ist, wie er kommuniziert, was für Parameter erwartet werden und welche Werte zurückgegeben werden. Wir fangen einfach mal damit an eine wsdl Datei zu analysieren.Für einen ersten groben Überblick schauen wir uns eine „leere“ WSDL Datei an. Für eine bessere Verständlichkeit ist es von Vorteil die abstrakte Datei von unten nach oben zu betrachten und später auch zu schreiben.
<?xml version="1.0" encoding="utf-8"?> <definitions> <message> <part /> </message> <message> <part /> </message> <message> <part /> </message> <portType> <operation> <input /> <output /> <fault /> </operation> </portType> <binding> <operation> <soap:operation /> <input> <soap:body/> </input> <output> <soap:body /> </output> <fault > <soap:fault /> </fault> </operation> </binding> <service> <port> <soap:address /> </port> </service> </definitions>
Nehmen wir uns zunächst den <service/> Teil der WSDL vor. Hier wird der Name und der Ort beschrieben, an dem unser Webservice später liegt, zudem wird das binding angegeben (nächster Block), mit dem dieser Service verknüpft ist.
Im binding Teil der WSDL werden die Operationen und ihre Kommunikationsform festgelegt, zudem wird die Form des inputs (sprich: der erwarteten Anfrage), des Outputs (sprich: der zu erwartenden Antwort), und des Faults (sprich: der evtl. Fehlernachricht) angegeben.
Im dritten Block von unten, dem PortType Block, verknüpfen wir die Ein- und Ausgaben mit den Nachrichtendefinitionen,
Womit wir auch schon bei den letzten drei Blöcken angelangt wären, hier werden die Messages, sprich: Nachrichten, definiert.
Fangen wir doch einfach mit einem Beispiel an.
Aufbau einer WSDL
Beispiel:
Beispiele zu finden die jedem gefallen ist schwer, wenn nicht gar unmöglich. Webservices oder SOAP sind zwar keine Programmiersprache, aber versuchen wir es doch mit dem klassischen Ansatz, wir sagen unserem Webservice unseren Namen und er wird uns begrüßen. Versprochen!
Nehmen wir uns also wieder die WSDL zu Brust, wie immer fangen wir von unten an.
<service name="Hello"> <port name="HelloPort" binding="tns:HelloBinding"> <soap:address location="http://127.0.0.1/hello_server.php" /> </port> </service>
Unser Dienst soll Hello heißen, dieser Name kann natürlich frei gewählt werden, genauso wie der Name vom Port, auch der Name des Binding kann frei gewählt werden. Hier gilt es zu beachten, dass tns: vor dem gewählten Namen steht. Das tns: steht für targetnamespace. Definitionen werden in XML Namespaces zugewiesen, womit es bspw. möglich ist verschiedene Webservicedefinitionen in einer Datei unter zu bringen. Auf Namespaces möchte ich allerdings nicht eingehen, da es ein komplexes Thema ist, welches die Verständlichkeit nicht gerade erleichtert.
Im nächsten Block, dem Binding, legen wir fest wie die Nachrichten codiert werden.
<binding> <operation name="sHello"> <soap:operation soapAction="urn:HelloAction" style="rpc" /> <input name="sHelloRequest"> <soap:body use="encoded" namespace="urn:HelloNamespace" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </input> <output name="sHelloResponse" > <soap:body use="encoded" namespace="urn:HelloNamespace" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </output> <fault name="sHelloFault"> <soap:fault name="sTokenReturnFault" use="encoded" namespace="urn:HelloNamespace" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </fault> </operation> </binding>
Wir haben eine Operation im Binding. Ihr Name ist sHello, dieser Name kann frei gewählt werden. Unter soap:operation legen wir einen mit dem Attribut soapAction ein Namespace für diese Operation fest. Wichtig zu wissen ist, dass dies eine url sein sollte, jedoch frei gewählt werden kann, um dies zu beweisen vergeben wir den Namen urn:HelloAction. Mit style geben wir das Format an mit dem die Operation später kommuniziert. Für einen SOAP webservice ist rpc die beste Wahl.
Die fertige WSDL Datei
Die wichtigstenVerbindungen innerhalb der WSDL Datei sind farblich markiert...<?xml version="1.0" encoding="utf-8"?> <definitions name="HelloDefinitions" targetNamespace="urn:helloNamespace" xmlns:tns="urn:helloNamespace" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" > <message name="sHelloRequest"> <part name="vorname" type="xsd:string" /> </message> <message name="sHelloResponse"> <part name="return" type="xsd:string" /> </message> <message name="sHelloFault"> <part name="fault" type="xsd:string" /> </message> <portType name="HelloPortType"> <operation name="sHello" > <input name="sHelloRequest" message="tns:sHelloRequest" /> <output name="sHelloResponse" message="tns:sHelloResponse" /> <fault name="sHelloFault" message="tns:sHelloFault"/> </operation> </portType> <binding name="HelloBinding" type="tns:HelloPortType"> <operation name="sHello"> <soap:operation soapAction="urn:HelloAction" style="rpc" /> <input name="sHelloRequest"> <soap:body use="encoded" namespace="urn:helloNamespace" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </input> <output name="sHelloResponse" > <soap:body use="encoded" namespace="urn:helloNamespace" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </output> <fault name="sHelloFault"> <soap:fault name="sHelloFault" use="encoded" namespace="urn:helloNamespace" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </fault> </operation> </binding> <service name="Hello"> <port name="HelloPort" binding="tns:HelloBinding"> <soap:address location="http://127.0.0.1/hello_server.php" /> </port> </service>
Fortsetzung folgt...