Une API SOAP gratuite pour tester, avec un WSDL
Un service de calculatrice avec WSDL et un service des pays, tous deux répondant en SOAP 1.1 et 1.2.
Exemples exécutés pour la dernière fois contre l’API le
Pour une API SOAP publique contre laquelle tester un client, utilisez https://api.testingapis.com/api/soap/calculatorconnectez-vous pour voir. Son WSDL se trouve à https://api.testingapis.com/api/soap/calculator?wsdlconnectez-vous pour voir, et SoapUI, Postman, WCF et zeep pour Python savent l’importer. Elle a quatre opérations : Add, Subtract, Multiply et Divide. Elle accepte SOAP 1.1 et SOAP 1.2 et renvoie de vrais SOAP faults, vous pouvez donc tester les erreurs aussi bien que les résultats. Un second service, /api/soap/countriesconnectez-vous pour voir, renvoie des fiches pays structurées. Les deux sont gratuits, sans inscription ni clé d’API.
| Calculatrice | Pays | |
|---|---|---|
| Point d’accès | POST /api/soap/calculatorconnectez-vous pour voir | POST /api/soap/countriesconnectez-vous pour voir |
| WSDL | GET /api/soap/calculator?wsdlconnectez-vous pour voir | Aucun. Un GET sur le point d’accès renvoie un JSON d’utilisation et une enveloppe d’exemple |
| Namespace | http://tempuri.org/ | http://example.com/countries |
| Opérations | Add, Subtract, Multiply, Divide (entiers) | GetCountryInfo(countryCode), ListCountries() |
| Versions | SOAP 1.1 et 1.2 | SOAP 1.1 et 1.2 |
L’appeler avec curl (SOAP 1.1)
SOAP 1.1 utilise Content-Type: text/xml et un en-tête SOAPAction qui nomme l’opération. Ici l’en-tête est facultatif, mais si vous l’envoyez, il doit correspondre à l’opération du corps.
curl -X POST https://api.testingapis.com/api/soap/calculator \
-H 'Content-Type: text/xml; charset=utf-8' \
-H 'SOAPAction: "http://tempuri.org/Add"' \
-d '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Add xmlns="http://tempuri.org/"><intA>5</intA><intB>3</intB></Add>
</soap:Body>
</soap:Envelope>'HTTP/1.1 200 OK
content-type: text/xml; charset=utf-8
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<AddResponse xmlns="http://tempuri.org/">
<AddResult>8</AddResult>
</AddResponse>
</soap:Body>
</soap:Envelope>SOAP 1.2 et faults
SOAP 1.2 utilise Content-Type: application/soap+xml, un autre namespace d’enveloppe et aucun en-tête SOAPAction. La réponse revient dans la même version que la requête. Diviser par zéro renvoie un fault de type Receiver :
curl -X POST https://api.testingapis.com/api/soap/calculator \
-H 'Content-Type: application/soap+xml; charset=utf-8' \
-d '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<Divide xmlns="http://tempuri.org/"><intA>10</intA><intB>0</intB></Divide>
</soap:Body>
</soap:Envelope>'HTTP/1.1 500 Internal Server Error
content-type: application/soap+xml; charset=utf-8
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<soap:Fault>
<soap:Code>
<soap:Value>soap:Receiver</soap:Value>
</soap:Code>
<soap:Reason>
<soap:Text xml:lang="en">Attempted to divide by zero.</soap:Text>
</soap:Reason>
</soap:Fault>
</soap:Body>
</soap:Envelope>Les règles des faults suivent les spécifications, et c’est précisément contre elles qu’un client doit être testé :
| Cas | SOAP 1.1 | SOAP 1.2 |
|---|---|---|
| Mauvaise entrée (code pays inconnu) | 500, faultcode soap:Client | 400, Code soap:Sender |
| Erreur côté serveur (division par zéro) | 500, faultcode soap:Server | 500, Code soap:Receiver |
| SOAPAction nomme une autre opération | Fault 500 | Sans objet |
| Mauvais Content-Type (JSON par exemple) | 415 avec une erreur JSON | 415 avec une erreur JSON |
L’utiliser depuis un client SOAP
SoapUI
- Choisissez File, puis New SOAP Project.
- Collez
https://api.testingapis.com/api/soap/calculator?wsdlconnectez-vous pour voir comme WSDL initial et terminez. SoapUI crée une requête pour chaque opération dans les deux bindings. - Ouvrez une requête, remplissez
intAetintB, puis lancez-la.
Python avec zeep
zeep lit le WSDL et en construit un client typé, et les SOAP faults deviennent des exceptions Python :
# pip install zeep
from zeep import Client
client = Client("https://api.testingapis.com/api/soap/calculator?wsdl")
print(client.service.Add(intA=5, intB=3))
print(client.service.Multiply(intA=6, intB=7))
try:
client.service.Divide(intA=10, intB=0)
except Exception as err:
print(type(err).__name__, err)8
42
Fault Attempted to divide by zero.JavaScript avec fetch
Sans bibliothèque SOAP, une requête est une chaîne XML et le résultat se lit dans le texte de la réponse :
const envelope = `<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Multiply xmlns="http://tempuri.org/">
<intA>6</intA>
<intB>7</intB>
</Multiply>
</soap:Body>
</soap:Envelope>`;
const res = await fetch("https://api.testingapis.com/api/soap/calculator", {
method: "POST",
headers: {
"Content-Type": "text/xml; charset=utf-8",
SOAPAction: '"http://tempuri.org/Multiply"',
},
body: envelope,
});
const xml = await res.text();
console.log(res.status, xml.match(/<MultiplyResult>(.*?)<\/MultiplyResult>/)[1]);
// 200 42Le service des pays
La calculatrice ne renvoie que des nombres. Pour tester la lecture de fiches imbriquées, utilisez le service des pays. Il compte 10 pays (US, GB, IN, DE, FR, JP, BR, CA, AU et ZA). ListCountries renvoie les codes et les noms, et GetCountryInfo une fiche complète :
curl -X POST https://api.testingapis.com/api/soap/countries \
-H 'Content-Type: text/xml' \
-d '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetCountryInfo xmlns="http://example.com/countries">
<countryCode>IN</countryCode>
</GetCountryInfo>
</soap:Body>
</soap:Envelope>'<GetCountryInfoResponse xmlns="http://example.com/countries">
<Country>
<Code>IN</Code>
<Name>India</Name>
<Capital>New Delhi</Capital>
<Currency>INR</Currency>
<PhoneCode>+91</PhoneCode>
<Continent>Asia</Continent>
<Population>1428627663</Population>
</Country>
</GetCountryInfoResponse>Un code inconnu renvoie un fault client :
HTTP/1.1 500 Internal Server Error
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Country code 'ZZ' not found.</faultstring>
</soap:Fault>API associées
La référence de l’API SOAP liste chaque opération avec des enveloppes prêtes à envoyer. Pour tester un client qui consomme du XML en REST classique, essayez l’API d’utilisateurs en XML. Le convertisseur JSON vers XML aide à comparer un contenu SOAP avec son équivalent JSON. Pour apprendre SOAP depuis le début, avec WSDL, faults, XPath et une suite de tests Java, suivez le tutoriel SOAP et XML (en anglais).