Aller au contenu principal
~/GiwiSoft
M4mtj5m4mtj5m4mt

Curl pour attaquer un Web service SOAP

Giwi 2 min de lecture Linux

L’autre jour, je me suis retrouvé confronté à un problème : comment tester un Web Service en envoyant une enveloppe SOAP uniquement en ligne de commande (sans soapUI). La solution, c’est CURL.

Il faut créer un fichier “req.txt” par exemple, contenant toute la requête SOAP.

$ curl -X POST -d @req.txt http://pipo.server.domain.com:9004/UrlWSaTester

Exemple complet de requête SOAP

Voici un exemple de fichier req.txt :

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<getStockPrice xmlns="http://example.com/ws">
<symbol>GOOG</symbol>
</getStockPrice>
</soap:Body>
</soap:Envelope>

En-têtes essentiels : SOAPAction et Content-Type

La plupart des services SOAP nécessitent les entêtes SOAPAction et Content-Type :

$ curl -X POST -H "Content-Type: text/xml; charset=utf-8" \
-H "SOAPAction: \"getStockPrice\"" \
-d @req.txt \
http://pipo.server.domain.com:9004/UrlWSaTester
  • Content-Type : text/xml - obligatoire pour SOAP 1.1 ; pour SOAP 1.2, utiliser application/soap+xml
  • SOAPAction - URI identifiant l’opération ; peut être vide ("") selon le service

Debug avec curl -v

L’option -v affiche les entêtes échangés, pratique pour comprendre ce qui se passe :

$ curl -v -X POST -H "Content-Type: text/xml; charset=utf-8" \
-H "SOAPAction: \"getStockPrice\"" \
-d @req.txt \
http://pipo.server.domain.com:9004/UrlWSaTester

-v affiche la requête complète (entêtes + corps) et la réponse reçue. Pour encore plus de détail, utilisez --trace - ou --trace-ascii -.

Pretty-print de la réponse XML

La réponse brute est difficile à lire. Passez-la dans xmllint :

$ curl -s -X POST -H "Content-Type: text/xml; charset=utf-8" \
-H "SOAPAction: \"getStockPrice\"" \
-d @req.txt \
http://pipo.server.domain.com:9004/UrlWSaTester \
| xmllint --format -

Alternative moderne : HTTPie

httpie offre une syntaxe plus naturelle et un affichage colorisé par défaut :

$ http POST http://pipo.server.domain.com:9004/UrlWSaTester \
Content-Type:text/xml;charset=utf-8 \
SOAPAction:'"getStockPrice"' \
< req.txt

HTTPie colorise automatiquement le XML de réponse et affiche les entêtes de manière lisible, ce qui en fait une excellente alternative à curl pour le développement quotidien.