SOAP

A l'origine

SOAP

Simple Object Access Protocol

Qu'est-ce ?

  • Protocole d’échange de messages (client / serveur)

  • Permet des appels RPC (Remote Procedure Call)

  • XML + HTTP = SOAP

  • Message = enveloppe (Header + Body)

Historique

  • SOAP 0.9 (septembre 1999)
    • Editeur (Microsoft, DeveloppMentor, UserLand)
  • SOAP 1.1 (Avril 2000)
    • IBM & Soumission W3C
  • W3C SOAP 1.2 (Sept 2000 à Mai 2002)
    • Refonte SOAP 1.1
    • Groupe de travail : 40 entreprises (IBM, Microsoft, Sun, Intel, Xerox, Canon ...)

Philosophie SOAP

  • Codification simple

  • Protocole minimaliste

  • Construit pour être porté sur toutes plates-formes et technologies

Pourquoi utiliser XML ?

  • Utilise du texte

  • Construire correctement du texte XML est simple

  • XML est adopté par tous les acteurs de l’Internet

  • XML permet d’ajouter du typage et de la structure à des informations

Mise en oeuvre

Contract First

  • Descriptions des échanges XML
  • Création du contrat: XML, XSL, …
  • Génération des classes en fonction du WSDL
  • Création du service

Contract Last

  • Description des interfaces
  • Implémentation du service
  • Construction du WSDL à partir du code Java

Structure des messages

Entête

  • Contient des entrées non applicatives
    • Transactions, sessions, ...

  • L’attribut mustUnderstand
    • soap:mustUnderstand="0|1"

Entête

<SOAP-ENV:Header>
    <t:Transaction xmlns:t="some-URI" SOAP-ENV:mustUnderstand="1">
        5
    </t:Transaction>
</SOAP-ENV:Header>

Corps

  • Contient des entrées applicatives

  • Encodage des entrées

  • Namespace pour l’encodage

Corps : Encodage

Types primitifs

<element name="price" type="float"/>

<element name="greeting" type="xsd:string"/>

<price>15.57</price>

<greeting id="id1">Hello</greeting>
<element name="Book">
    <complexType>
        <element name="author" type="xsd:string"/>
        <element name="title" type="xsd:string"/>
    </complexType>
</element>

<e:Book>
    <author>J.R.R Tolkien</author>
    <title>A hobbit story</title>
</e:Book>

Structures

Corps : Encodage

Enumérations

<element name="color">
    <simpleType base="xsd:string">
        <enumeration value="Green"/>
        <enumeration value="Blue"/>
    </simpleType>
</element>

<color>Blue</color>
<e:Book id="id1">
    <title>My Life and Work</title>
    <firstauthor href="#Person-1"/>
</e:Book>

<e:Person id="Person-1">
    <name>Henry Ford</name>
    <address xsi:type="m:Electronic-address">
</e:Person>

Référence

Exemple d'encodage

<element name="Person" base="tns:Person"/>

<complexType name="Person">
    <sequence minOccurs="0" maxOccurs="1">
        <element name="name" type="xsd:string"/>
        <element name="address" type="tns:Address"/>
    </sequence>
    <attribute name="href" type="uriReference"/>
    <attribute name="id" type="ID"/>
    <anyAttribute namespace="##other"/>
</complexType>

Exemple de Body

<soap:Envelope xmlns:soap='uri for soap'>
    <soap:Body>
        <calculateArea xmlns='interfaceURI'>
            <origin><x>23</x><y>34</y></origin>
            <corner><x>23</x><y>34</y></corner>
        </calculateArea>
    </soap:Body>
</soap:Envelope>

Retour d'erreurs (fault)

  • 4 éléments

    • Faultcode (obligatoire)
      • Code d’erreur utilisé par le logiciel

    • Faultstring (obligatoire)
      • Explication lisible d’un humain

    • Faultactor (optionel)
      • Erreur en cours de cheminement du message (firewall, proxy, MOM)

Retour d'erreurs (fault)

  • 4 éléments

    • Detail
      • Détail de l’erreur non lié au Body du message

    • Autres
      • D’autres éléments qualifiés par un namespace peuvent être ajoutés

Exemple de Fault

MustUnderstand

HTTP/1.1 500 Internal Server Error
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <SOAP-ENV:Fault>
            <faultcode>SOAP-ENV:MustUnderstand</faultcode>
            <faultstring>SOAP Must Understand Error</faultstring>
        </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Exemple de Fault

Erreur sur le corps

HTTP/1.1 500 Internal Server Error
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <SOAP-ENV:Fault>
            <faultcode>SOAP-ENV:Server</faultcode>
            <faultstring>Server Error</faultstring>
            <detail>
                <e:myfaultdetails xmlns:e="Some-URI">
                    <message> My application didn't work </message>
                    <errorcode>1001</errorcode>
                </e:myfaultdetails>
            </detail>
        </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Exemple SOAP

<soap:Envelope xmlns:soap=‘uri for soap’>
    <soap:Body>
        <Add xmlns=‘interfaceURI’>
            <arg1>24</arg1>
            <arg2>53.2</arg2>
        </Add>
    </soap:Body>
</soap:Envelope>
<soap:Envelope xmlns:soap=‘uri for soap’>
    <soap:Body>
        <AddResponse xmlns=‘interfaceURI’>
            <sum>77.2</sum>
        </AddResponse>
    </soap:Body>
</soap:Envelope>

Requête

Réponse

WSDL

Web Service Description Language

Qu'est-ce ?

  • Langage de définition de Web Services

  • Basé entièrement sur XML

  • Standard W3C (Initiative IBM et Microsoft)

  • Définition de l’interface, de l’URL et du port du Web Service.

  • Utilise le système de typage de XML Schéma

Structure du WSDL

  • <types>
    • Contient les définitions de types utilisant un système de typage (comme XSD).
  • <message>
    • Décrit les noms et types d’un ensemble de champs à transmettre
    • Paramètres d’une invocation, valeur du retour, ...
  • <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

Structure du WSDL

  • <binding>
    • Spécifie une liaison d’un <porttype> à un protocole concret (SOAP1.1, HTTP1.1, MIME, ...). 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.
  • <service>
    • Une collection de points d’entrée (endpoint) relatifs.

Eléments <types>

Contient les définition de types utilisant un système de typage 

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

Eléments <message>

Décrit les noms et types d’un ensemble de champs à transmettre

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

Eléments <porttype>

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 de faute (<fault>).

Eléments <porttype>

Plusieurs types d’opérations

  • Solicit-response
    • Le point d’entrée envoie un message (<output>) et recoit un message corrélé (<input>) ou un ou plusieurs messages de faute (<fault>).
  • Notification
    • Le point d’entrée envoie un message de notification (<output>)

Eléments <porttype>

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

Eléments <binding>

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

Spécifie une liaison d’un <porttype> à un protocole concret

Eléments <service>

<?xml version="1.0" ?>
<definitions name="urn:AddressFetcher" 
    targetNamespace="urn:AddressFetcher2"
    xmlns:typens="urn:xml-soap-address-demo"
    xmlns:xsd="http://www.w3.org/1999/XMLSchema"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns="http://schemas.xmlsoap.org/wsdl/">
    ...
    <!-- service decln -->
    <service name="AddressBookService">
        <port name="AddressBook" binding="AddressBookSOAPBinding">
            <soap:address location="http://www.mycomp.com/soap/servlet/rpcrouter"/>
        </port>
    </service>
</definitions>

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

UDDI

Universal Description, Discovery and Integration

Qu'est-ce ?

Sert à décrire une manière standard de publier et d'interroger les services web proposés par un réseau

Objectif

Permettre de localiser sur le réseau le service Web recherché

  • Les pages blanches comprennent la liste des entreprises ainsi que des informations associées à ces dernières
  • Les pages jaunes recensent les services Web de chacune des entreprises
  • Les pages vertes fournissent des informations techniques précises sur les services fournis

Pourquoi ce n'est (presque) plus utilisé

  • Essayer de solutionner un problème qui n’existait pas

  • Trop complexe
Made with Slides.com