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)
- Faultcode (obligatoire)
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
- Detail
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
SOAP
By benjamin tourman
SOAP
- 398