Was genau verbirgt sich hinter dem Wort Webservice ? Anhand eines Beispiels möchte ich Ihnen zeigen wie man ganz einfach mit ASP, VBScript und ein wenig XLM (SOAP) einen Webservice baut und auch versteht!
Anfangs sieht das alles sehr kompliziert aus und alles ist undurchschaubar. Im ersten Teil möchte ich Ihnen das wsdl-File vorstellen. Übersetzt heisst das Web Services Description Language, also eine Art Vorlage die einen WebService beschreibt.
Das Beispiel wird uns eine Liste mit den vorhandenen Foren von Devtrain liefern
Hier das komplettes wsdl File für unser Beispiel.
<?xml version='1.0' encoding='UTF-8' ?> <definitions name ='ICS' targetNamespace = 'http://tempuri.org/wsdl/' xmlns:wsdlns='http://tempuri.org/wsdl/' xmlns:typens='http://tempuri.org/type' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:xsd='http://www.w3.org/2000/10/XMLSchema' xmlns:stk='http://schemas.microsoft.com/soap-toolkit/wsdl-extension' xmlns='http://schemas.xmlsoap.org/wsdl/'> <types> <schema targetNamespace='http://tempuri.org/type' xmlns='http://www.w3.org/2000/10/XMLSchema' xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'> </schema> </types> <message name='ICS.getForumList'> <part name='USR' type='xsd:string'/> <part name='PWD' type='xsd:string'/> <part name='KND' type='xsd:string'/> </message> <message name='ICS.getForumListResponse'> <part name='Result' type='xsd:string'/> </message> <portType name='ICSSoapPort'> <operation name='getForumList' parameterOrder='USR PWD KND'> <input message='wsdlns:ICS.getForumList' /> <output message='wsdlns:ICS.getForumListResponse' /> </operation> </portType> <binding name='ICSSoapBinding' type='wsdlns:ICSSoapPort' > <stk:binding preferredEncoding='UTF-8'/> <soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http' /> <operation name='getForumList' > <soap:operation soapAction='http://tempuri.org/action/ICS.getForumList' /> <input> <soap:body use='encoded' namespace='http://tempuri.org/message/' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' /> </input> <output> <soap:body use='encoded' namespace='http://tempuri.org/message/' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' /> </output> </operation> </binding> <service name='ICS' > <port name='ICSSoapPort' binding='wsdlns:ICSSoapBinding' > <soap:address location='http://IhrServer/Verzeichnis/ics.asp' /> </port> </service> </definitions> |
Analysieren wir einmal das wsdl-File und seine Elemente
Das <types> Element
Das <types> Element spezifiziert im WebService die verschiedenen Datentypen die verwendet werden können.
Das <message> Element
Das <message> Element im meiner WSDL - Datei beschreibt den logischen Inhalt (Aufbau) meiner Funktion.
Meine Funktion benötigt den Benutzernamen (USR), das Passwort (PWD) und die Art in der meine Liste der Foren zurückgegeben werden soll. In diesem Fall muss ich ein Request und ein Response Message-Element erzeugen.
Die <message> Elemente besitzen auch noch mehrere <part> Elemente die als Argumente und auch als Beschreibung meines Ergebnisses in meinen WebService genutzt werden. Jedes dieser <part> Elemente besitzt einen Namen und den Datentyp.
Die Request-Message getForumList wird via SOAP mit den dazugehörigen <part> Elementen die im SOAP-Body stehen zum Server geschickt und startet somit die Anfrage auf die Funktion.
Die Response-Message getForumListResponse ist die Antwort auf die Anfrage die durch die Request-Message getForumList ausgelöst wurde.
Das <portType> Element
Hier werden sämtliche Operationen und die beteiligten Messages aufgelistet. Es können natürlich mehrere Operationen (bzw. Funktionen) die benötigt werden aufgelistet werden. In meinem Beispiel habe ich nur eine Operation.
Das Attribut name des <operation>-Elements beschreibt den Funktionsnamen (Operationsname). In parameterOrder stehen meine Argumente, die ich via SOAP zu Server schicken möchte. In unserem Fall sind es drei Argumente die einfach mit einem Leerzeichen getrennt werden.
Das <operation>-Element besitzt noch zwei weitere Elemente, nämlich <input> und <output>.
Das <input>-Element repräsentiert dan Request der Message, das <output>-Element den Response.
Das <binding> Element
Das <binding> Element spezifiziert die Protokolldetails für die verschiedenen Operationen, die im <portType> Element definiert werden.
Es wird für jede Operation beschrieben, wie man den abstrakten Inhalt seiner Messages in ein konkretes Format abbildet.
Jedes <binding> Element hat eine name- und ein type-Attribut. Das Namensattribut gibt einen eindeutigen Namen für dieses Binding an. Das type-Attribut kennzeichnet die Portart, die es bindet. Dieses ist die gleiche Portart, welches im <portType> Element definiert wurde.
Das <soap:binding> Element hat zwei Attribute.
Das style-Attribut zeigt an, ob die Operation ein Remote Procedure Call (RPC) oder eine Dokument-orientierte Operation ist.
Wenn Sie das style-Attribut nicht im <operation> Element spezifizieren, dann ist der Standardwert des style-Attributes, im <soap:binding> Element zu spezifizieren.
Das Transportattribut spezifiziert die Art des zu verwendenden Bindings.
Das folgende Fragment zeigt dieses <soap:binding> Element:
<soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http' /> |
In diesem Beispiel zeigt der RPC- Wert, der für das style-Attribut spezifiziert wird an, daß die Operation eine RPC-orientierte Operation darstellt anstelle einer Dokument-orientierter.
Der Wert für das Transportattribut zeigt, daß das Binden dem HTTP Binding entspricht, das im Simple Object Access Protocol spezifiziert istFür jede der Input- und Output Messages, beschreibt das <soap:body> Element, wie die verschiedenen Messages innerhalb des SOAP <Body> Elements erscheinen sollen.
Das use-Attribut zeigt an, ob man Teile der Messages verschlüsselt. Wenn diese Teile (use="encoded"), verschlüsselt werden, dann referenziert jedes Teils ein abstraktes DataTypeSet das durch das type-Attribut im <part> Element des <message> Elements gesetzt wurde.
Diese abstrakten Typen erstellen ein konkretes Message, indem sie die Kodierung anwenden, die im encodingStyle-Attribut spezifiziert wird. Das encodingStyle-Attribut spezifiziert die Art der Verschlüsselung.
Das namespace-Attribut stellt Namespaces für das Wrapper-Element zur Verfügung, das die Parameter falls Sie von einer RPC-style Operation kommen wrapt.
Das <service> Element
Das <service>-Element kennzeichnet einen Service.
Abhängig von der Zahl der Ports, die in der WSDL-Datei und in ihrer Verbindung definiert werden, kann eine WSDL-Datei eines oder mehrere <service>-Elemente enthalten.
Das <soap:address> Element enthält die Adresse des SOAP Request Handlers
Wenn ein Client einen SOAP-Request zum Server sendet um eine Operation anzufordern, muß er den Service , den Port im Service identifizieren und die Operation kennzeichnen, die er zusammen mit den Inputparameterinhalten durchführt.
Der Request Handler verarbeitet die Anfrage des Clients und sendet eine SOAP-Antwort zurück.