Qu’est-ce que SOAP ?
SOAP est un protocole de messagerie XML pour l’échange d’informations structurées dans les services web. Il permet la communication entre applications indépendamment des plateformes et langages.
Les 3 rôles principaux de SOAP
- Enveloppe (Envelope) : Définit le cadre pour décrire le contenu du message et comment le traiter
- Règles d’encodage : Définit comment représenter les types de données de l’application
- Convention RPC : Définit une convention pour représenter les appels de procédures distantes et leurs réponses
Structure d’un message SOAP
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Header>
<!-- Informations optionnelles : authentification, transaction, routing -->
</soap:Header>
<soap:Body>
<!-- Contenu principal du message : requête ou réponse -->
</soap:Body>
</soap:Envelope>Composants
Envelope : Élément racine obligatoire qui identifie le document XML comme un message SOAP
Header (optionnel) : Contient des informations de méta-données
- Authentification
- Informations de transaction
- Routage
- Peut contenir plusieurs blocs d’en-tête
Body (obligatoire) : Contient les données réelles du message
- Requête ou réponse
- Peut contenir un élément Fault pour les erreurs
Attributs SOAP importants
mustUnderstand
<soap:Header>
<m:Transaction
xmlns:m="http://www.example.org/transaction"
soap:mustUnderstand="1">
<transactionID>12345</transactionID>
</m:Transaction>
</soap:Header>- Valeur “1” ou “true” : Le destinataire DOIT comprendre et traiter cet en-tête
- Si non compris : le destinataire doit rejeter le message avec une erreur
- Permet de garantir le traitement de fonctionnalités critiques
encodingStyle
<soap:Body soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<!-- Données encodées selon le style spécifié -->
</soap:Body>- Définit les règles de sérialisation des données
- Peut être appliqué à n’importe quel élément SOAP
- Hérité par les éléments enfants
Namespaces XML dans SOAP
Les namespaces évitent les conflits de noms entre éléments :
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:m="http://www.exemple.com/meteo"
xmlns:c="http://www.exemple.com/commande">
<soap:Body>
<m:GetTemperature>
<m:City>Paris</m:City>
</m:GetTemperature>
</soap:Body>
</soap:Envelope>Namespaces courants :
soap: http://www.w3.org/2003/05/soap-envelope (SOAP 1.2)soap: http://schemas.xmlsoap.org/soap/envelope/ (SOAP 1.1)xsi: http://www.w3.org/2001/XMLSchema-instancexsd: http://www.w3.org/2001/XMLSchema
Exemple de message SOAP complet (Requête)
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:bank="http://www.example.com/banking">
<soap:Header>
<bank:Authentication soap:mustUnderstand="1">
<bank:Username>john.doe</bank:Username>
<bank:Password>secret123</bank:Password>
</bank:Authentication>
</soap:Header>
<soap:Body>
<bank:GetAccountBalance>
<bank:AccountNumber>123456789</bank:AccountNumber>
</bank:GetAccountBalance>
</soap:Body>
</soap:Envelope>Exemple de message SOAP complet (Réponse)
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:bank="http://www.example.com/banking">
<soap:Body>
<bank:GetAccountBalanceResponse>
<bank:Balance>15420.50</bank:Balance>
<bank:Currency>EUR</bank:Currency>
</bank:GetAccountBalanceResponse>
</soap:Body>
</soap:Envelope>SOAP Fault (Gestion des erreurs)
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<soap:Fault>
<soap:Code>
<soap:Value>soap:Sender</soap:Value>
</soap:Code>
<soap:Reason>
<soap:Text xml:lang="fr">Numéro de compte invalide</soap:Text>
</soap:Reason>
<soap:Detail>
<error>Le compte 123456789 n'existe pas</error>
</soap:Detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>Codes d’erreur SOAP 1.2 :
soap:Sender: Erreur côté client (message mal formé, données invalides)soap:Receiver: Erreur côté serveur (service indisponible, erreur interne)soap:MustUnderstand: En-tête obligatoire non comprissoap:VersionMismatch: Version SOAP incompatible
Styles d’interaction SOAP
1. Style RPC (Remote Procedure Call)
Orienté opération : on appelle une méthode distante avec des paramètres.
<soap:Body>
<m:CalculerSomme xmlns:m="http://exemple.com/math">
<m:nombre1>15</m:nombre1>
<m:nombre2>25</m:nombre2>
</m:CalculerSomme>
</soap:Body>Réponse :
<soap:Body>
<m:CalculerSommeResponse xmlns:m="http://exemple.com/math">
<m:resultat>40</m:resultat>
</m:CalculerSommeResponse>
</soap:Body>Caractéristiques :
- Nom de l’opération visible dans le Body
- Paramètres individuels
- Ressemble à un appel de fonction
- Couplage fort
2. Style Document
Orienté document : on échange des documents XML complets.
<soap:Body>
<Commande xmlns="http://exemple.com/commandes">
<numeroCommande>CMD-2024-001</numeroCommande>
<client>
<nom>Dupont</nom>
<email>dupont@example.com</email>
</client>
<articles>
<article>
<reference>ART-123</reference>
<quantite>2</quantite>
</article>
</articles>
</Commande>
</soap:Body>Réponse :
<soap:Body>
<ConfirmationCommande xmlns="http://exemple.com/commandes">
<numeroCommande>CMD-2024-001</numeroCommande>
<statut>Acceptée</statut>
<montantTotal>150.00</montantTotal>
</ConfirmationCommande>
</soap:Body>Caractéristiques :
- Document métier complet
- Structure flexible
- Validation par schéma XML possible
- Couplage faible
- Plus adapté aux échanges B2B
Différences clés
| Aspect | RPC | Document |
|---|---|---|
| Orientation | Opération/Méthode | Document/Message |
| Structure | Paramètres distincts | Document structuré |
| Validation | Difficile | Via XML Schema |
| Couplage | Fort | Faible |
| Usage typique | Appels simples | Processus métier complexes |
Quand utiliser chaque style ?
Style RPC :
- Opérations simples avec peu de paramètres
- Appels synchrones rapides
- API de calcul ou de requête simple
- Exemple : Calculatrice, conversion de devises
Style Document :
- Échanges complexes de données métier
- Validation stricte nécessaire
- Traçabilité et audit
- Processus asynchrones
- Exemple : Commandes, factures, dossiers médicaux
Fiabilité et Ordre des messages
WS-ReliableMessaging
Protocole qui garantit la livraison fiable des messages SOAP malgré les défaillances réseau.
Fonctionnalités :
- Garantie de livraison (au moins une fois, au plus une fois, exactement une fois)
- Détection et élimination des doublons
- Ordre de livraison garanti
- Gestion des accusés de réception
Création d’une séquence
<soap:Envelope xmlns:soap="..." xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm">
<soap:Header>
<wsrm:CreateSequence>
<wsrm:AcksTo>
<wsa:Address>http://client.example.com/callback</wsa:Address>
</wsrm:AcksTo>
</wsrm:CreateSequence>
</soap:Header>
<soap:Body>
<!-- Corps vide pour création de séquence -->
</soap:Body>
</soap:Envelope>Message dans une séquence
<soap:Envelope xmlns:soap="..." xmlns:wsrm="...">
<soap:Header>
<wsrm:Sequence>
<wsrm:Identifier>uuid:12345-67890-abcdef</wsrm:Identifier>
<wsrm:MessageNumber>3</wsrm:MessageNumber>
</wsrm:Sequence>
</soap:Header>
<soap:Body>
<TransferFunds>
<amount>1000</amount>
<fromAccount>123</fromAccount>
<toAccount>456</toAccount>
</TransferFunds>
</soap:Body>
</soap:Envelope>Accusé de réception
<soap:Header>
<wsrm:SequenceAcknowledgement>
<wsrm:Identifier>uuid:12345-67890-abcdef</wsrm:Identifier>
<wsrm:AcknowledgementRange Lower="1" Upper="5"/>
<wsrm:AcknowledgementRange Lower="7" Upper="10"/>
<!-- Message 6 manquant, sera retransmis -->
</wsrm:SequenceAcknowledgement>
</soap:Header>Garantie de l’ordre
L’ordre de traitement est garanti par :
- Numérotation séquentielle des messages
- Le récepteur attend les messages manquants avant de traiter les suivants
- Retransmission automatique des messages perdus
Exemple de scénario :
- Messages envoyés : 1, 2, 3, 4, 5
- Messages reçus : 1, 2, 4, 5 (3 perdu)
- Le récepteur traite 1 et 2, puis attend 3
- Une fois 3 reçu (retransmis), il traite 3, 4, 5 dans l’ordre
Cas d’usage
Utiliser WS-ReliableMessaging quand :
- Les messages ne doivent pas être perdus (transactions financières)
- L’ordre est critique (étapes d’un workflow)
- Le réseau est instable
- Communication asynchrone sur longue période
Ne pas utiliser si :
- Communication synchrone simple suffit
- Overhead de performance inacceptable
- Les messages sont idempotents et l’ordre n’importe pas
Analyse d’un message SOAP complexe
Exemple complet avec authentification, transaction et gestion d’erreurs potentielles :
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:bank="http://www.example.com/banking/v2">
<soap:Header>
<!-- Authentification -->
<wsse:Security soap:mustUnderstand="1">
<wsse:UsernameToken>
<wsse:Username>john.doe@example.com</wsse:Username>
<wsse:Password Type="...#PasswordDigest">Hy6...==</wsse:Password>
<wsse:Nonce>MTIzNDU2Nzg5MA==</wsse:Nonce>
<wsse:Created>2024-01-15T10:30:00Z</wsse:Created>
</wsse:UsernameToken>
</wsse:Security>
<!-- Adressage -->
<wsa:To>http://bank.example.com/services/transfer</wsa:To>
<wsa:Action>http://www.example.com/banking/TransferFunds</wsa:Action>
<wsa:MessageID>uuid:abcd-1234-efgh-5678</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://client.example.com/callback</wsa:Address>
</wsa:ReplyTo>
<!-- Transaction -->
<bank:TransactionContext soap:mustUnderstand="1">
<bank:TransactionID>TXN-2024-001-XYZ</bank:TransactionID>
<bank:Timeout>PT30S</bank:Timeout>
</bank:TransactionContext>
<!-- Séquence fiable -->
<wsrm:Sequence xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm">
<wsrm:Identifier>uuid:seq-9876-5432</wsrm:Identifier>
<wsrm:MessageNumber>42</wsrm:MessageNumber>
</wsrm:Sequence>
</soap:Header>
<soap:Body>
<bank:TransferFunds>
<bank:FromAccount>
<bank:AccountNumber>FR76 1234 5678 9012 3456 7890 123</bank:AccountNumber>
<bank:AccountType>CHECKING</bank:AccountType>
</bank:FromAccount>
<bank:ToAccount>
<bank:AccountNumber>FR76 0987 6543 2109 8765 4321 098</bank:AccountNumber>
<bank:BankCode>BNPAFRPP</bank:BankCode>
</bank:ToAccount>
<bank:Amount currency="EUR">2500.00</bank:Amount>
<bank:Description>Paiement facture #INV-2024-156</bank:Description>
<bank:ExecutionDate>2024-01-16</bank:ExecutionDate>
</bank:TransferFunds>
</soap:Body>
</soap:Envelope>Analyse étape par étape :
-
Envelope et namespaces
- SOAP 1.2 (soap)
- WS-Addressing (wsa)
- WS-Security (wsse)
- Namespace métier personnalisé (bank)
-
Header - Sécurité (mustUnderstand=“1”)
- Authentification par username/password
- Password hashé (Digest)
- Nonce pour éviter les attaques par rejeu
- Timestamp de création
-
Header - Adressage
- Destination du message (To)
- Action à effectuer
- ID unique du message
- Adresse de réponse asynchrone
-
Header - Contexte transactionnel (mustUnderstand=“1”)
- ID de transaction pour traçabilité
- Timeout de 30 secondes
-
Header - Messaging fiable
- Séquence identifiée
- Numéro de message dans la séquence
-
Body - Données métier
- Opération : TransferFunds
- Compte source avec type
- Compte destination avec code banque
- Montant avec devise
- Métadonnées : description, date d’exécution
Points d’attention :
- Deux en-têtes avec mustUnderstand=“1” : le service doit les supporter
- Communication asynchrone (ReplyTo différent de l’émetteur)
- Sécurisé et fiable (Security + ReliableMessaging)
- Traçable (MessageID, TransactionID, MessageNumber)