Un document WSDL se compose d'un ensemble d'éléments décrivant les types de données utilisés par le service, les messages que le service peut recevoir, ainsi que les liaisons SOAP associées à chaque message. Le schéma suivant illustre la structure du langage WSDL qui est un document XML, en décrivant les relations entre les sections constituant un document WSDL.

Image utilisateur

Un fichier WSDL contient donc sept éléments.

  • Types : fournit la définition de types de données utilisés pour décrire les messages échangés.

  • Messages : représente une définition abstraire (noms et types) des données en cours de transmission.

  • PortTypes : décrit un ensemble d'opérations. Chaque opération a zéro ou un message en entrée, zéro ou plusieurs messages de sortie ou d'erreurs.

  • Binding : spécifie une liaison entre un <portType> et un protocole concret (SOAP, HTTP...).

  • Service : indique les adresses de port de chaque liaison.

  • Port : représente un point d'accès de services défini par une adresse réseau et une liaison.

  • Opération : c'est la description d'une action exposée dans le port.

Le document WSDL 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>.

La description abstraite est composée des éléments qui sont orientés vers la description des capacités du service Web. Ses éléments abstraits définissent les messages SOAP de façon totalement indépendante de la plate-forme et de la langue. Cela facilite la définition d'un ensemble de services pouvant être implémentés par différents sites Web. Les quatre éléments abstraits XML qui peuvent être définis dans un WSDL sont :

  • <wsdl:types> ;

  • <wsdl:message> ;

  • <wsdl:operation> ;

  • <wsdl:portType>.

L'élément types

L'élément <types> décrit tous les types de données utilisés entre le client et le serveur. Ces types sont l'équivalent en structures C++ ou Java à des classes qui ne contiennent que des données et pas de méthodes.
WSDL n'est pas liée exclusivement à un système de typage, mais il utilise le XML schéma de la spécification W3C :

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

L'élément message

L'élément <message> comprend la section Messages. Si nous envisageons les opérations comme des fonctions, alors un élément <message> définit les paramètres pour cette fonction. L'exemple suivant représente les messages correspondant à l'ajout d'un nouveau client à un service Web.

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

L'élément opération

L'élément <operation> est analogue à un appel de méthode en Java ou d'une sous-routine dans Visual Basic. La différence est que 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 :

  • Request/Response : le client envoie la demande, et le service répond.

  • Solicit/Response : un service Web envoie un message au client, et le client répond.

  • One-way : un client envoie un message au service Web, mais ne s'attend à aucune réponse.

  • Notification : un service Web envoie un message au client, mais n'attend pas de réponse.

L'élément portType

Un port est simplement une suite d'opérations. De nombreux langages de programmation appellent cela une bibliothèque, un module ou une classe, mais dans le monde de l'échange de messages, les points de connexion sont des ports, et la définition abstraite d'un port est appelée <portType>.

L'élément <portType> contient l'ensemble des opérations que peut effectuer un service Web. Cependant, il ne fournit pas d'informations sur la façon de se connecter directement à ce service. Il prévoit un point d'arrêt où un client peut obtenir des informations sur tous les traitements offerts par un service Web. La syntaxe d'un portType est définie comme suit :

<wsdl:portType name ="newCustomerPortType">
 <wsdl:operation name="createNewCustomer">
  <wsdl:input message="addCustomer"/>
  <wsdl:output message="confirmationResponse"/>
 </wsdl:operation>
</wsdl:portType>

L'élément <PortType> défini dans l'exemple est identifié par un nom unique newCustomerPortType. Il contient l'opération createNewsCustomer de type Request/Response qui va ajouter un nouveau client au service Web en utilisant les messages d'entrée (input) et de sortie (output) définis précédemment dans la section message.

L'élément binding

L'élément <binding> permet d'obtenir les informations nécessaires pour connecter physiquement un service Web. Il décrit 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.

Le langage WSDL possède des extensions internes pour définir des services SOAP, de fait, les informations spécifiques à SOAP se retrouvent dans cet élément.

L'élément <binding> a deux objectifs. Tout d'abord, il sert de lien entre les éléments abstraits et les éléments concrets dans le WSDL. Ensuite, il fournit un conteneur pour des informations telles que le protocole et l'adresse du service Web.

La syntaxe d'un élément <binding> est représentée comme suit :

<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. Si la valeur de cet attribut est encoded, comme dans notre exemple, alors la valeur de l'attribut encodingStyle fait référence à une URL qui indique comment les données doivent être codées. Dans notre exemple, les opérations d'entré (input) et sortie (output) utilisent le même style de codage défini par l'URL : « [..]schemas.xmlsoap.org/soap/encoding/ ».

L'élément port

Un port définit un point d'accès individuel, en spécifiant une adresse unique pour une liaison binding. La syntaxe d'un <port> est la suivante :

<wsdl:port binding="newCustomerBinding" name="newCustomerPort">
  <soap:address location="http://www.stevepotts.com:1776/soap/servlet/rpcrouter">
</wsdl:port>

L'élément port contient deux attributs : l'attribut name et l'attribut binding. L'attribut name donne un nom unique parmi tous les ports définis dans le document WSDL. Dans notre exemple, le nom du port est newCustomerPort. L'attribut binding fait référence à l'élément bindingnewCustomerBinding défini dans la section binding du document WSDL.
Le port contient un élément <soap:address> qui spécifie à l'aide de l'attribut location une URL représentant l'adresse du port. Dans notre exemple, l'adresse du port est : « [..]www.stevepotts.com:1776/soap/servlet/rpcrouter ».

Un port ne doit pas définir plus d'une adresse. Un port ne doit pas définir d'autres informations de liaisons autres que celles de l'adresse.

L'élément service

L'élément <service> définit les ports soutenus par le service Web. Il contient aussi un élément <documentation> qui fournit la documentation lisible par l'homme. Pour chaque liaison supportée, un élément port est désigné. L'élément <service> n'est donc qu'une simple collection de ports.

La syntaxe d'un élément <service> est présentée comme suit :

<wsdl:service name="newCustomerService">
 <documentation>Ajouter un nouveau client</documentation>

  <wsdl:port binding="newCustomerBinding" name="newCustomerPort">
   <soap:address location="http://www.stevepotts.com:1776/soap/servlet/rpcrouter">
  </wsdl:port>

</wsdl:service>

L'attribut name<wsdl:service name=[..]> donne un nom unique parmi tous les services définis dans un document WSDL. Dans notre exemple, cet attribut a pour valeur newCustomerService.
L'élément service défini dans l'exemple contient le port newCustomerPort qui est associé avec la liaison bindingNewCustomerService utilise donc le protocole SOAP, et est accessible via l'adresse définie dans l'élément port.

L'élément définition

L'élément racine dans un document WSDL est <wsdl:definition>. Il contient un attribut targetNamespace qui définit un certain nombre d'espaces de noms namespace auquel tous les noms déclarés dans un élément du document WSDL appartiennent, ce qui permet d'éviter les conflits de nommage.

La syntaxe de l'élément <definition> :

<wsdl:definition name="customerExemple" targetNamespace="http://www.stevepotts.com/customer.wsdl"
		 xmlns:soap="http://www.schemas.xmlsoap.org/wsdl/soap/"
		 xmlns:wsdl="http://www.schemas.xmlsoap.org/wsdl/"
		 xmlns="http://www.stevepotts.com/customer.xsd"

Dans cet exemple, l'attribut targetNamespace a pour valeur l'URL : «[..]www.stevepotts.com/customer.wsdl». Cela signifie que tous les noms déclarés dans ce document WSDL appartiennent à cet espace de noms.
Le reste du document WSDL apparaît sous cet élément et la fin de ce document est indiquée par </wsdl:definition>.

L'auteur