Savon XML
- SOAP signifie Simple O bject A ccess Protocol _
- SOAP est un protocole de communication d'application
- SOAP est un format d'envoi et de réception de messages
- SOAP est indépendant de la plate-forme
- SOAP est basé sur XML
- SOAP est une recommandation du W3C
Pourquoi SAVON ?
Il est important que les applications Web puissent communiquer sur Internet.
Le meilleur moyen de communiquer entre les applications est via HTTP, car HTTP est pris en charge par tous les navigateurs et serveurs Internet. SOAP a été créé pour accomplir cela.
SOAP fournit un moyen de communiquer entre les applications exécutées sur différents systèmes d'exploitation, avec différentes technologies et langages de programmation.
Blocs de construction SOAP
Un message SOAP est un document XML ordinaire contenant les éléments suivants :
- Un élément Enveloppe qui identifie le document XML en tant que message SOAP
- Un élément Header qui contient des informations d'en-tête
- Un élément Body qui contient les informations d'appel et de réponse
- Un élément Fault contenant des erreurs et des informations d'état
Tous les éléments ci-dessus sont déclarés dans l'espace de noms par défaut pour l'enveloppe SOAP :
http://www.w3.org/2003/05/soap-envelope/
et l'espace de noms par défaut pour l'encodage SOAP et les types de données est :
http://www.w3.org/2003/05/soap-encoding
Règles de syntaxe
Voici quelques règles de syntaxe importantes :
- Un message SOAP DOIT être encodé en XML
- Un message SOAP DOIT utiliser l'espace de noms SOAP Envelope
- Un message SOAP ne doit PAS contenir de référence DTD
- Un message SOAP ne doit PAS contenir d'instructions de traitement XML
Message SOAP squelette
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
...
</soap:Header>
<soap:Body>
...
<soap:Fault>
...
</soap:Fault>
</soap:Body>
</soap:Envelope>
L'élément d'enveloppe SOAP
L'élément d'enveloppe SOAP requis est l'élément racine d'un message SOAP. Cet élément définit le document XML comme un message SOAP.
Exemple
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
L'espace de noms xmlns:soap
Notez l'espace de noms xmlns:soap dans l'exemple ci-dessus. Il doit toujours avoir la valeur : "http://www.w3.org/2003/05/soap-envelope/".
L'espace de noms définit l'enveloppe comme une enveloppe SOAP.
Si un espace de noms différent est utilisé, l'application génère une erreur et ignore le message.
L'attribut encodingStyle
L'attribut encodingStyle est utilisé pour définir les types de données utilisés dans le document. Cet attribut peut apparaître sur n'importe quel élément SOAP et s'applique au contenu de l'élément et à tous les éléments enfants.
Un message SOAP n'a pas d'encodage par défaut.
Syntaxe
soap:encodingStyle="URI"
Exemple
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
L'élément d'en-tête SOAP
L'élément optionnel SOAP Header contient des informations spécifiques à l'application (telles que l'authentification, le paiement, etc.) sur le message SOAP.
Si l'élément Header est présent, il doit être le premier élément enfant de l'élément Envelope.
Remarque : Tous les éléments enfants immédiats de l'élément Header doivent être qualifiés par un espace de noms.
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
L'exemple ci-dessus contient un en-tête avec un élément "Trans", un attribut "mustUnderstand" avec une valeur de 1 et une valeur de 234.
SOAP définit trois attributs dans l'espace de noms par défaut. Ces attributs sont : mustUnderstand, actor et encodingStyle.
Les attributs définis dans l'en-tête SOAP définissent comment un destinataire doit traiter le message SOAP.
L'attribut mustUnderstand
L'attribut SOAP mustUnderstand peut être utilisé pour indiquer si une entrée d'en-tête est obligatoire ou facultative à traiter par le destinataire.
Si vous ajoutez mustUnderstand="1" à un élément enfant de l'élément Header, cela indique que le récepteur qui traite l'en-tête doit reconnaître l'élément. Si le récepteur ne reconnaît pas l'élément, il échouera lors du traitement de l'en-tête.
Syntaxe
soap:mustUnderstand="0|1"
Exemple
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
L'attribut acteur
Un message SOAP peut voyager d'un expéditeur à un destinataire en passant par différents points de terminaison le long du chemin du message. Cependant, toutes les parties d'un message SOAP peuvent ne pas être destinées au point de terminaison ultime, à la place, il peut être destiné à un ou plusieurs des points de terminaison sur le chemin du message.
L'attribut d'acteur SOAP est utilisé pour adresser l'élément d'en-tête à un point de terminaison spécifique.
Syntaxe
soap:actor="URI"
Exemple
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:actor="https://www.w3schools.com/code/">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
L'attribut encodingStyle
L'attribut encodingStyle est utilisé pour définir les types de données utilisés dans le document. Cet attribut peut apparaître sur n'importe quel élément SOAP, et il s'appliquera au contenu de cet élément et à tous les éléments enfants.
Un message SOAP n'a pas d'encodage par défaut.
Syntaxe
soap:encodingStyle="URI"
L'élément corps du savon
L'élément de corps SOAP requis contient le message SOAP réel destiné au point de terminaison ultime du message.
Les éléments enfants immédiats de l'élément Corps SOAP peuvent être qualifiés d'espace de noms.
Exemple
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPrice xmlns:m="https://www.w3schools.com/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
L'exemple ci-dessus demande le prix des pommes. Notez que les éléments m:GetPrice et Item ci-dessus sont des éléments spécifiques à l'application. Ils ne font pas partie de l'espace de noms SOAP.
Une réponse SOAP pourrait ressembler à ceci :
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPriceResponse xmlns:m="https://www.w3schools.com/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
L'élément d'erreur SOAP
L'élément optionnel SOAP Fault est utilisé pour indiquer les messages d'erreur.
L'élément SOAP Fault contient les erreurs et les informations d'état d'un message SOAP.
Si un élément Fault est présent, il doit apparaître comme un élément enfant de l'élément Body. Un élément Fault ne peut apparaître qu'une seule fois dans un message SOAP.
L'élément SOAP Fault a les sous-éléments suivants :
Sub Element | Description |
---|---|
<faultcode> | A code for identifying the fault |
<faultstring> | A human readable explanation of the fault |
<faultactor> | Information about who caused the fault to happen |
<detail> |
Holds application specific error information related to the Body element |
Codes d'erreur SOAP
Les valeurs de code d'erreur définies ci-dessous doivent être utilisées dans l'élément de code d'erreur lors de la description des défauts :
Error | Description |
---|---|
VersionMismatch | Found an invalid namespace for the SOAP Envelope element |
MustUnderstand | An immediate child element of the Header element, with the mustUnderstand attribute set to "1", was not understood |
Client | The message was incorrectly formed or contained incorrect information |
Server | There was a problem with the server so the message could not proceed |
Le protocole HTTP
HTTP communique via TCP/IP. Un client HTTP se connecte à un serveur HTTP via TCP. Après avoir établi une connexion, le client peut envoyer un message de requête HTTP au serveur :
POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200
Le serveur traite ensuite la demande et renvoie une réponse HTTP au client. La réponse contient un code d'état qui indique l'état de la demande :
200 OK
Content-Type: text/plain
Content-Length: 200
Dans l'exemple ci-dessus, le serveur a renvoyé un code d'état de 200. Il s'agit du code de réussite standard pour HTTP.
Si le serveur n'a pas pu décoder la requête, il aurait pu renvoyer quelque chose comme ceci :
400 Bad Request
Content-Length: 0
Liaison SAVON
La spécification SOAP définit la structure des messages SOAP, et non la manière dont ils sont échangés. Cette lacune est comblée par ce qu'on appelle les "liaisons SOAP". Les liaisons SOAP sont des mécanismes qui permettent d'échanger efficacement des messages SOAP à l'aide d'un protocole de transport.
La plupart des implémentations SOAP fournissent des liaisons pour les protocoles de transport courants, tels que HTTP ou SMTP.
HTTP est synchrone et largement utilisé. Une requête HTTP SOAP spécifie au moins deux en-têtes HTTP : Content-Type et Content-Length.
SMTP est asynchrone et est utilisé en dernier recours ou dans des cas particuliers.
Les implémentations Java de SOAP fournissent généralement une liaison spécifique pour le protocole JMS (Java Messaging System).
Type de contenu
L'en-tête Content-Type d'une demande et d'une réponse SOAP définit le type MIME du message et le codage de caractères (facultatif) utilisé pour le corps XML de la demande ou de la réponse.
Syntaxe
Content-Type: MIMEType; charset=character-encoding
Exemple
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Contenu-Longueur
L'en-tête Content-Length d'une demande et d'une réponse SOAP spécifie le nombre d'octets dans le corps de la demande ou de la réponse.
Syntaxe
Content-Length: bytes
Exemple
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
Un exemple SOAP
Dans l'exemple ci-dessous, une requête GetStockPrice est envoyée à un serveur. La demande a un paramètre StockName et un paramètre Price qui seront renvoyés dans la réponse. L'espace de noms de la fonction est défini dans "http://www.example.org/stock".
Une requête SOAP :
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPrice>
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
La réponse SOAP :
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPriceResponse>
<m:Price>34.5</m:Price>
</m:GetStockPriceResponse>
</soap:Body>
</soap:Envelope>