Les premiers pas
Le SOAP est du XML ! Autrement dit, SOAP est une application de la spécification XML. Il s'appuie fortement sur les normes XML telles que XML Schema et XML Namespaces pour sa définition et sa fonction.
Messagerie XML
La messagerie XML est l'endroit où les applications échangent des informations à l'aide de documents XML :
Il offre aux applications un moyen flexible de communiquer et constitue la base de SOAP. Un message peut être n'importe quoi : un bon de commande, une demande de prix actuel d'une action, une requête pour un moteur de recherche, une liste des vols disponibles vers Montréal, ou n'importe quel nombre d'autres éléments d'information pouvant être pertinents pour une application particulière.
Étant donné que XML n'est pas lié à une application, un système d'exploitation ou un langage de programmation particulier, les messages XML peuvent être utilisés dans tous les environnements. Un programme Perl sous Windows peut créer un document XML représentant un message, l'envoyer à un programme Java basé sur Unix et affecter le comportement de ce programme Java.
L'idée fondamentale est que deux applications, quel que soit le système d'exploitation, le langage de programmation ou tout autre détail de mise en oeuvre technique, peuvent partager ouvertement des informations en utilisant rien de plus qu'un simple message codé d'une manière que les deux applications comprennent. Le SOAP fournit un moyen standard de structurer les messages XML.
RPC et EDI
La messagerie XML, et donc SOAP, a deux applications liées : RPC et EDI. L'appel de procédure distante (RPC) est la base de l'informatique distribuée, la manière pour un programme de faire en sorte qu'une procédure (ou une fonction, ou une méthode, appelez-la comme vous voulez) en appelle une autre, en passant des paramètres et en recevant des valeurs de retour. L'échange électronique de documents (EDI) est la base des transactions commerciales automatisées, définissant un format et une interprétation standard des documents et messages financiers et commerciaux.
Si vous utilisez SOAP pour EDI (connu sous le nom de SOAP "de type document"), le XML sera alors un bon de commande, un remboursement de taxe ou un document similaire. Si vous utilisez SOAP pour RPC (appelé, sans surprise, SOAP "de style RPC"), le XML sera une représentation de paramètres ou de valeurs de retour.
La nécessité d'un encodage standard
Si vous échangez des données entre les systèmes hétérogènes, vous devez vous mettre d'accord sur une représentation commune. Comme vous pouvez le voir dans l'exemple suivant, un seul élément de données comme un numéro de téléphone peut être représenté de nombreuses manières différentes et également valides dans XML :
<numeroTelephone>(123) 456-7890</numeroTelephone>
<numeroTelephone>
<codeRegion>123</codeRegion>
<echange>456</echange>
<numero>7890</numero>
</numeroTelephone>
<numeroTelephone region="123" echange="456" etiquette="7890" />
<telephone region="123">
<echange>456</echange>
<numero>7890</numero>
</telephone>
Le bon codage dépend essentiellement de l'application. En d'autres termes, dire simplement que le serveur et le client utilisent XML pour échanger des informations ne suffit pas. Nous devons définir :
- Les types d'informations que nous échangeons
- Comment ces informations doivent être exprimées en XML.
- Comment faire réellement l'envoi de ces informations
Sans ces conventions convenues, les programmes ne peuvent pas savoir comment décoder les informations qu'elles sont données, même si elles sont encodées en XML. Le SOAP fournit ces conventions.
Messages SOAP
Un message SOAP se compose d'une enveloppe contenant un entête en option et un corps requis, comme le montre l'image suivante :
L'entête contient des blocs d'informations pertinents pour la façon dont le message doit être traité. Cela inclut les paramètres de routage et de livraison, les affirmations d'authentification ou d'autorisation et les contextes de transaction. Le corps contient le message actuel à délivrer et à traiter. Tout ce qui peut être exprimé en syntaxe XML peut aller dans le corps d'un message.
La syntaxe XML pour exprimer un message SOAP est basée sur l'espace http://www.w3.org/2001/06/soap-envelope. Cet identifiant d'espace de noms XML pointe vers un schéma XML définissant la structure de ce à quoi ressemble un message SOAP.
Si vous utilisiez un style de document SOAP, vous pouvez transférer un bon de commande avec le XML dans l'exemple suivant :
<soap:Envelope xmlns:soap="http://www.w3.org/2001/06/soap-envelope">
<soap:Header>
<m:transaction xmlns:m="soap-transaction" soap:mustUnderstand="true">
<transactionID>1234</transactionID>
</m:transaction>
</soap:Header>
<soap:Body>
<n:achatCommande xmlns:n="urn:serviceCommande">
<source>
<personne>Steve Tremblay</personne>
<dept>Cordonniers</dept>
</source>
<destination>
<personne>Donald Gagnon</personne>
<dept>Comptable</dept>
</destination>
<commande>
<quantite>1</quantite>
<item>Souliers</item>
</commande>
</n:achatCommande>
</soap:Body>
</soap:Envelope>
Cet exemple illustre tous les composantes principaux de la spécification de l'enveloppe de SOAP. Il y a le <soap:Envelope>, le conteneur le plus haut comprenant le message de SOAP; le <soap:Header> en option, contenant des blocs supplémentaires d'informations sur la façon dont la charge utile corporelle doit être traitée; et l'élément obligatoire <soap:Body> contenant le message actuel à traiter.
Enveloppes
Chaque élément <soap:Envelope> doit contenir exactement un élément <soap:Body>. L'élément <soap:Body> peut contenir autant de noeuds enfants que nécessaire. Le contenu de l'élément <soap:Body> est le message. L'élément <soap:Body> est défini de telle manière qu'il peut contenir n'importe quel XML valide et bien formé ayant été qualifié d'espace de noms et ne contient aucune instruction de traitement ou références de définition de type de document (DTD).
Si une enveloppe contient un élément <soap:Header>, elle ne doit en contenir pas plus d'un et elle doit apparaître comme le premier enfant de l'enveloppe, avant le <soap:Body>. Le <soap:Header>, comme le <soap:Body>, peut contenir n'importe quel XML valide, bien formé et nommé d'espace de noms que le créateur du message SOAP souhaite insérer.
Chaque élément contenu dans <soap:Header> est appelé bloc d'entête. Le but d'un bloc d'entête est de communiquer des informations contextuelles pertinentes pour le traitement d'un message SOAP. Un exemple peut être un bloc d'entête contenant des informations d'authentification ou des informations de routage de messages. Dans l'exemple précédent, le bloc d'entête indique que le document a un ID de transaction de "1234".
Messages RPC
Généralement, les messages sont en paires, comme le montre la figure suivante :
Ainsi, d'un côté une requête (le client envoie des informations d'appel de fonction au serveur) et de l'autre, la réponse (le serveur renvoie la valeur de retour(s) au client). Le SOAP ne nécessite pas que chaque requête ait une réponse, ou vice versa, mais il est courant de voir l'appariement de requête-réponse.
L'attribut mustUnderstand
Lorsqu'un message SOAP est envoyé d'une application à une autre, il existe une exigence implicite que le destinataire doit comprendre comment traiter ce message. Si le destinataire ne comprend pas le message, le destinataire doit rejeter le message et expliquer le problème à l'expéditeur.
Les blocs d'entête sont différents. Un destinataire peut comprendre ou non comment gérer un bloc d'entête particulier, mais toujours être en mesure de traiter correctement le message principal. Si l'expéditeur du message veut exiger que le destinataire comprenne un bloc particulier, il peut ajouter un attribut mustUnderstand="true" au bloc d'entête. Si ce drapeau est présent et que le destinataire ne comprend pas le bloc auquel il est joint, le destinataire doit rejeter l'intégralité du message.