webservice

WSDL : Web Service Description Language

  • Comme on l’a vu avec XML RPC il est souvent difficile rien qu’à lecture d’un document XML :
    • De déterminer les paramètres à lui fournir
    • De connaître la structure du document en retour
    • De connaître les éventuels code erreur
    • D’anticiper les traitements effectués.
  • Pour remédier à cet état de fait il a été normaliser un langage
  • WSDL : Web Service Description Language Langage XML dédié à la description de tous les éléments nécessaires pour interagir avec un service réseau (ou service web).
  • W3C

    • WSDL 1 est prévu pour fonctionner avec SOAP 1.1
    • WSDL 2 est prévu pour fonctionner avec SOAP 1.2
  • WSDL est un langage XML qui permet de décrire: un service réseau (service Web), et comment l’ invoquer (localisation, paramètre, structure de retour, ..)

Objectif

Décrire les services comme un ensemble d’opérations et de messages abstraits reliés à des protocoles et des serveurs réseaux Cet objectif se rapproche d’IDL pour CORBA.

WSDL standardise les schémas XML utilisés pour établir une connexion entre émetteurs et récepteurs. Par conséquent, il est possible d’automatiser certaines opérations nécessaires à l’appel

Un document WSDL est donc associé à un Web Service afin d’en décrire l’ensemble des éléments qu’il expose vers le monde extérieur :

  • types de données (XSD)
  • types de messages
  • liaisons avec le protocole de transport et le format des messages (SOAP 1.X, HTTP Get et HTTP Post, ou encore MIME)

Les services sont vus comme des ensembles de ports réseaux

Balises

<types>

Contient les définition de types utilisant un système de typage (comme XSD).

<types>
<xsd:schema targetNamespace="http://exemple.com/personne.xsd"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<xsd:complexType name=“Personne”>
<xsd:element name=“Nom”  type=“xsd:string”>
<xsd:element name=“Prenom”  type=“xsd:string”>
<xsd:element name=“Age”  type=“xsd:float”>
</complexType>
</types>

<message>

Décrit les noms et types d’un ensemble de champs à transmettre (Paramêtres d’une invocation, valeur du retour, …)

<message name="GetPersonne">
    <part name="body" type="per:Personne"/>
</message>
<message name="AddPersonne">
<part name="Nom" type="xsd:string"/>
<part name="Prenom" type="xsd:string"/>
<part name="Age" type="xsd:float"/>
</message>

<portType>

Décrit un ensemble d’opérations. Chaque opération a zero ou un message en entrée, zero ou plusieurs message de sortie ou de fautes

  • L’élément <portType> décrit un ensemble d’opérations.
  • Plusieurs types d’opérations
    • One-way : Le point d’entrée reçoit un message (<input>).
    • Request-response : Le point d’entrée reçoit un message (<input>) et retourne un message corrélé (<output>) ou un ou plusieurs messages d’erreur (<fault>).
    • Solicit-response : Le point d’entrée envoie un message (<ouput>) et recoit un message corrélé (<input>) ou un ou plusieurs messages d’erreur (<fault>).
    • Notification : Le point d’entrée envoie un message de notification (<ouput>)

Paramètres : Les champs des messages constituent les paramètres (in,out, inout) des opérations

<portType name="CarnetAdresse">
    <operation name="AddPersonne">
        <input message="AddPersonneRequest"/>
    </operation>

    <operation name="GetPersonneParNom">
        <input    message="GetPersonneParNom Request"/>
        <output message=" GetPersonneParNom Response"/>
    </operation>
</portType>

<binding>

Spécifie une liaison d’un <porttype> à un protocole concret (SOAP1.1, HTTP1.1, MIME, …). Un porttype peut avoir plusieurs liaisons !

  • L’élément <binding> spécifie La liaison d’un <portType> à un protocole concret (SOAP1.1, HTTP GET/POST, MIME, …).
  • Un <portType> peut avoir plusieurs <binding> pour répondre à plusieurs protocoles.
  • La balise suivante : <soap:binding transport="uri" style="soap_style" /> précise que le binding est de type SOAP.
  • La balise <transport> définit le type de transport pour utiliser SOAP/HTTP
  • La balise <style> définit la façon dont sont créer les messages SOAP de toutes les opérations
    • rpc : Encodage RPC défini par SOAP RPC
    • document : Encodage sous forme d’élément XML c’est ce mode qui est utilisé par défaut.
  • Pour chaque de <portType> :
    • il faut préciser l’URI de l’opération : <soapAction>
    • Il est aussi possible de repréciser la façon dont sont créés les messages SOAP : <style>
  • Pour chaque message de chaque opération, il faut définir comment sera créé le message SOAP
<binding type="CarnetAdresseBinding">
    <soap:binding 
        transport="http://schemas.xmlsoap.org/soap/http"
        style="rpc" />
    <operation name="GetPersonneParNomOpe">
    <soap:operation  soapAction="http://exemple.com/ GetPersonneParNom " />
        <input>
            <soap:body use="encoded" 
                 encodingStyle="schemas.xmlsoap.org/soap/encoding"/>
         </input>
         <output>
            <soap:body use="encoded" 
                 encodingStyle="schemas.xmlsoap.org/soap/encoding"/>
         </output>
    </operation>
</binding>

<port>

Spécifie un point d’entrée (endpoint) comme la combinaison d’un et d’une adresse réseau.

L’élément <port> est associé à un <portType>

Dans le cadre de SOAP, un élément <port> à une adresse (qui correspond à l’adresse http)

<port name="CarnetAdressePort" binding="per:CarnetAdresseBinding "> 
        <soap:address     location="http://example.com/GetPersonneParNom"/>
</port>

<service>

Une collection de points d’entrée (endpoint) relatifs.

<service name=“CarnetAdresseService">
        <port name=" CarnetAdressePort "     binding="per:PersonnesBinding"> 
            <soap:address     location="http://example.com/GetPersonneParNom"/>
     </port>
</service>

Exemple

<?xml version="1.0" ?>
<definitions name="CarnetAdresse" targetNamespace="http://exemple.com/carnetAdresse.wsdl" xmlns:per="http://example.com/carnetAdresse.wsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/"> 
<types>
<xsd:schema targetNamespace="http://exemple.com/personne.xsd" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<xsd:complexType name="Personne">
<xsd:element name="Nom"  type="xsd:string">
<xsd:element name="Prenom”  type="xsd:string">
<xsd:element name="Age"  type="xsd:float">
</complexType>
</types>
<message name="GetPersonne">
    <part name="body" type="Personne"/>
</message>
<message name="AddPersonne">
<part name="Nom" type="xsd:string"/>
<part name="Prenom" type="xsd:string"/>
<part name="Age" type="xsd:float"/>
</message>
<portType name="CarnetAdresse">
    <operation name="AddPersonne">
        <input message="AddPersonneRequest"/>
    </operation>

    <operation name="GetPersonneParNom">
        <input    message="GetPersonneParNom Request"/>
        <output message=" GetPersonneParNom Response"/>
    </operation>
</portType>
<binding type="CarnetAdresseBinding">
    <soap:binding 
        transport="http://schemas.xmlsoap.org/soap/http"
        style="rpc" />
    <operation name="GetPersonneParNomOpe">
    <soap:operation  soapAction="http://exemple.com/ GetPersonneParNom " />
        <input>
            <soap:body use="encoded" 
                 encodingStyle="schemas.xmlsoap.org/soap/encoding"/>
         </input>
         <output>
            <soap:body use="encoded" 
                 encodingStyle="schemas.xmlsoap.org/soap/encoding"/>
         </output>
    </operation>
</binding>
<service name=“CarnetAdresseService">
        <port name=" CarnetAdressePort " binding="per:PersonnesBinding"> 
            <soap:address location="http://example.com/GetPersonneParNom"/>
     </port>
</service>
</definitions>