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.

CalculatricePays
Point d’accèsPOST /api/soap/calculatorconnectez-vous pour voirPOST /api/soap/countriesconnectez-vous pour voir
WSDLGET /api/soap/calculator?wsdlconnectez-vous pour voirAucun. Un GET sur le point d’accès renvoie un JSON d’utilisation et une enveloppe d’exemple
Namespacehttp://tempuri.org/http://example.com/countries
OpérationsAdd, Subtract, Multiply, Divide (entiers)GetCountryInfo(countryCode), ListCountries()
VersionsSOAP 1.1 et 1.2SOAP 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.

Terminal
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>'
Cet exemple utilise des points d’accès réservés aux membres connectés.Se connecterCréer un compte gratuit
Réponse
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 :

Terminal
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>'
Cet exemple utilise des points d’accès réservés aux membres connectés.Se connecterCréer un compte gratuit
Réponse
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é :

CasSOAP 1.1SOAP 1.2
Mauvaise entrée (code pays inconnu)500, faultcode soap:Client400, Code soap:Sender
Erreur côté serveur (division par zéro)500, faultcode soap:Server500, Code soap:Receiver
SOAPAction nomme une autre opérationFault 500Sans objet
Mauvais Content-Type (JSON par exemple)415 avec une erreur JSON415 avec une erreur JSON

L’utiliser depuis un client SOAP

SoapUI

  1. Choisissez File, puis New SOAP Project.
  2. 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.
  3. Ouvrez une requête, remplissez intA et intB, puis lancez-la.

Python avec zeep

zeep lit le WSDL et en construit un client typé, et les SOAP faults deviennent des exceptions Python :

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)
Cet exemple utilise des points d’accès réservés aux membres connectés.Se connecterCréer un compte gratuit
Sortie
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 :

JavaScript
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 42
Cet exemple utilise des points d’accès réservés aux membres connectés.Se connecterCréer un compte gratuit

Le 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 :

Terminal
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>'
Cet exemple utilise des points d’accès réservés aux membres connectés.Se connecterCréer un compte gratuit
Corps de la réponse (dans soap:Body)
<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 :

Réponse pour countryCode ZZ
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).