Le WSDL (Web Services Description Language) est une grammaire XML permettant de décrire un Web Service. C'est un
fichier que l'on pourrait comparer à une pièce d'identité, ou une interface Java, mais écrite en XML.
Il sert à décrire :
C'est donc le composant central d’un service web puisque il décrit le type du message, le port, le protocole de communication, les opérations possibles, son emplacement et ce que le client peut en attendre. Il permet de séparer la description des fonctionnalités abstraites offertes par un service, des détails concrets d'une description de service, tels que "comment" et "où" cette fonctionnalité est proposée.
Pour garantir l’interopérabilité, l’interface standard du service web doit être standardisée, afin que le consommateur et le producteur puissent partager et comprendre un message, et ce de manière indépendante de la plate-forme et du langage. C’est le rôle de WSDL ; SOAP, de son côté, définit la façon dont le message sera envoyé d’un ordinateur à l’autre.
Revenons au document WSDL. Il peut être divisé en deux parties. Une partie pour les définitions abstraites, tandis que la deuxième contient les descriptions concrètes.
La description concrète est composée des éléments qui sont orientés vers le client pour le service physique. Les trois éléments concrets XML présents dans un WSDL sont :
<message> : Décrit les noms et types d’un ensemble de champs à transmettre ( Paramêtres d’une invocation, valeur du retour, …).
Le nom d'un élément <message> de sortie se termine par Response. Dans cet exemple, le message de réponse est confirmationResponse, il renvoie au client un nombre entier lui indiquant le succès de l'opération.
Autre exemple :
<porttype> : Décrit un ensemble d’opérations. Chaque opération a zéro ou un message en entrée, zéro ou plusieurs message de sortie ou de fautes. Cet élément contient l'ensemble des opérations que peut effectuer un service Web.
<operation> : C'est la description d'une action exposée dans le port (cela correspond à un appel de méthode en Java). Seulement trois messages sont autorisés dans une opération:
<binding>
Spécifie une liaison d’un <porttype> à un protocole concret (SOAP1.1, HTTP1.1, MIME, …). Il donne les informations nécessaires pour connecter physiquement un service Web, et les spécifications concrètes de la manière dont le service sera implémenté : protocole de communication et format des données pour les opérations et messages définis par un portType particulier.
Un porttype peut avoir plusieurs liaisons.
<port> : Spécifie un point d’entrée (endpoint) comme la combinaison d’un <binding> et d’une adresse réseau. Ce point d'accès de services est défini par une adresse réseau et une liaison.
Il sert à décrire :
- le format de messages requis pour communiquer avec ce service
- les méthodes que le client peut invoquer
- la localisation du service
- le protocole de communication (SOAP RPC ou SOAP orienté message)
C'est donc le composant central d’un service web puisque il décrit le type du message, le port, le protocole de communication, les opérations possibles, son emplacement et ce que le client peut en attendre. Il permet de séparer la description des fonctionnalités abstraites offertes par un service, des détails concrets d'une description de service, tels que "comment" et "où" cette fonctionnalité est proposée.
Pour garantir l’interopérabilité, l’interface standard du service web doit être standardisée, afin que le consommateur et le producteur puissent partager et comprendre un message, et ce de manière indépendante de la plate-forme et du langage. C’est le rôle de WSDL ; SOAP, de son côté, définit la façon dont le message sera envoyé d’un ordinateur à l’autre.
Revenons au document WSDL. Il peut être divisé en deux parties. Une partie pour les définitions abstraites, tandis que la deuxième contient les descriptions concrètes.
La description concrète est composée des éléments qui sont orientés vers le client pour le service physique. Les trois éléments concrets XML présents dans un WSDL sont :
- <wsdl:service>
- <wsdl:port>
- <wsdl:binding>
- <wsdl:types>
- <wsdl:message>
- <wsdl:operation>
- <wsdl:portType>
<types> : Il fournit la définition de types de données ( avec un système de typage comme XSD) utilisés pour décrire les messages échangés.
<wsdl:types>
<xsd:schema targetNamespace="urn:xml-soap-address-demo"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<xsd:complexType name="phone">
<xsd:element name="areaCode" type="xsd:int" />
<xsd:element name="exchange" type="xsd:string" />
<xsd:element name="number" type="xsd:string" />
</xsd:complexType>
<xsd:complexType name="address">
<xsd:element name="streetNum" type="xsd:int" />
<xsd:element name="streetName" type="xsd:string" />
<xsd:element name="city" type="xsd:string" />
<xsd:element name="state" type="xsd:string" />
<xsd:element name="zip" type="xsd:int" />
<xsd:element name="phoneNumber" type="typens:phone" />
</xsd:complexType>
</xsd:schema>
</wsdl:types>
Autre exemple :<wsdl:types>
<xsd:schema targetNamespace="http://www.stevepotts.com/customer.xsd"
xmlns: xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="customer ID" type="xsd:string" />
<xsd:element name="lastname" type="xsd:string" />
<xsd:element name="firstname" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:type>
<message> : Décrit les noms et types d’un ensemble de champs à transmettre ( Paramêtres d’une invocation, valeur du retour, …).
<wsdl:message name="addCustomer">
<wsdl:part name="customerInfo" element="tns:customer" />
</wsdl:message>
<wsdl:message name="confirmationResponse">
<wsdl:part name="response" element="xsd:integer" />
</wsdl:message>
Chaque élément enfant <part> de l'élément <message> correspond à un paramètre et possède un attribut de nom et de type, tout comme un paramètre de fonction a un nom et un type. Les paramètres d'entrée sont définis dans un élément <message> unique et séparé des paramètres de sortie, qui se trouvent dans leur propre élément <message>. Le message addCustomer va ajouter un nouveau client (customer) au service Web par l'envoi d'une instance de l'élément client que nous avons défini dans l'élément <type>.Le nom d'un élément <message> de sortie se termine par Response. Dans cet exemple, le message de réponse est confirmationResponse, il renvoie au client un nombre entier lui indiquant le succès de l'opération.
Autre exemple :
<message name="AddEntryRequest">
<part name="name" type="xsd:string" />
<part name="address" type="typens:address" />
</message>
<message name="GetAddressFromNameRequest">
<part name="name" type="xsd:string" />
</message>
<message name="GetAddressFromNameResponse">
<part name="address" type="typens:address" />
</message>
<porttype> : Décrit un ensemble d’opérations. Chaque opération a zéro ou un message en entrée, zéro ou plusieurs message de sortie ou de fautes. Cet élément contient l'ensemble des opérations que peut effectuer un service Web.
<operation> : C'est la description d'une action exposée dans le port (cela correspond à un appel de méthode en Java). Seulement trois messages sont autorisés dans une opération:
- Input Message : définit les données que le service Web s'attend à recevoir.
- OutPut Message : définit les données que le service Web prévoit d'envoyer en réponse.
- Fault Message : définit les messages d'erreurs qui peuvent être retournés par le service Web.
Plusieurs types d'opération peuvent être déclarés dans un document WSDL :
- One-way : Le point d’entrée reçoit un message du client (<input>), mais ce dernier n'attend aucune réponse en retour.
- Request-response : Le point d’entrée reçoit un message du client (<input>) et retourne un message à celui-ci (<output>) ou un ou plusieurs messages de faute (<fault>).
- Solicit-response : Le point d’entrée envoie un message au client (<ouput>) et reçoit un message (<input>) du client ou un ou plusieurs messages de faute (<fault>). C'est l'opération inverse de la précédente.
- Notification : Le point d’entrée envoie un message de notification au client (<ouput>), mais ce dernier n'attend aucune réponse en retour. C'est l'inverse de One-way.
<wsdl:portType name="newCustomerPortType"> <wsdl:operation name="createNewCustomer"> <wsdl:input message="addCustomer" /> <wsdl:output message="confirmationResponse" /> </wsdl:operation> </wsdl:portType>Autre exemple:
<portType name="AddressBook"> <!– One way operation --> <operation name="addEntry"> <input message="AddEntryRequest" /> </operation> <!– Request-Response operation --> <operation name="getAddressFromName"> <input message="GetAddressFromNameRequest" /> <output message="GetAddressFromNameResponse" /> </operation> </portType>
<binding>
Spécifie une liaison d’un <porttype> à un protocole concret (SOAP1.1, HTTP1.1, MIME, …). Il donne les informations nécessaires pour connecter physiquement un service Web, et les spécifications concrètes de la manière dont le service sera implémenté : protocole de communication et format des données pour les opérations et messages définis par un portType particulier.
Un porttype peut avoir plusieurs liaisons.
<wsdl:binding name="newCustomerBinding" type="newCustomerPortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="createNewCustomer"> <soap:operation soapAction="http://wwww.stevepotts.com/createNewCustomer" /> <wsdl:input> <soap:body use="encoded" namespace="http://wwww.stevepotts.com/Customer" encodingStyle="http://schemas.xmlsoap.org/soap/encoding" /> </wsdl:input> <wsdl:output> <soap:body use="encoded" namespace="http://wwww.stevepotts.com/createNewCustomer" encodingStyle="http://schemas.xmlsoap.org/soap/encoding" /> </wsdl:output> </wsdl:operation> </wsdl:binding>La première ligne de l'élément binding contient les attributs name et type. L'attribut name indique le nom identifiant la liaison binding , ici le nom de la liaison est newCustomerBinding. L'attribut type permet d'établir la liaison avec un portType à travers le nom du portType. Dans notre cas, cette liaison fait référence au portType newCustomerPortTyp défini précédemment dans la section portType.
- soap:binding : cet élément indique que la liaison sera mise à disposition via SOAP. En outre, le protocole HTTP est utilisé pour envoyer les documents SOAP. L'attribut style indique le format des messages SOAP. Un style de valeur rpc spécifie un format RPC des données contenues dans le corps des messages SOAP échangés.
- soap:operation : cet élément indique la liaison d'une opération avec un protocole SOAP. L'attribut soapAction spécifie que l'en-tête SOAPAction HTTP doit être utilisé pour identifier le service.
- soap:body : cet élément fournit des détails sur la façon dont les messages d'entrée et de sortie doivent apparaître à l'intérieur du corps SOAP ainsi que le namespace de l'URL d'un service particulier. L'attribut use définit la manière dont les données sont encodées à l'intérieur du corps SOAP.
<!-- binding declns --> <binding name="AddressBookSOAPBinding" type="AddressBook"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> <operation name="addEntry"> <soap:operation soapAction="" /> <input> <soap:body use="encoded" namespace="urn:AddressFetcher2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </input> <output> <soap:body use="encoded" namespace="urn:AddressFetcher2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </output> </operation> <operation name="getAddressFromName"> <soap:operation soapAction="" /> <input> <soap:body use="encoded" namespace="urn:AddressFetcher2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </input> <output> <soap:body use="encoded" namespace="urn:AddressFetcher2" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </output> </operation> </binding>
<port> : Spécifie un point d’entrée (endpoint) comme la combinaison d’un <binding> et d’une adresse réseau. Ce point d'accès de services est défini par une adresse réseau et une liaison.
<service> : Une collection de points d’entrée (endpoint) relatifs.