Eine kostenlose SOAP-API zum Testen, mit WSDL

Ein Rechnerdienst mit WSDL und ein Länderdienst, beide antworten in SOAP 1.1 und 1.2.

Beispiele zuletzt am gegen die API ausgeführt

Für eine öffentliche SOAP-API, gegen die du einen Client testen kannst, nimm https://api.testingapis.com/api/soap/calculatoranmelden zum Anzeigen. Das WSDL liegt unter https://api.testingapis.com/api/soap/calculator?wsdlanmelden zum Anzeigen, und SoapUI, Postman, WCF und zeep für Python können es importieren. Es gibt vier Operationen: Add, Subtract, Multiply und Divide. Der Dienst nimmt SOAP 1.1 und SOAP 1.2 an und gibt echte SOAP Faults zurück, du kannst also Fehler ebenso testen wie Ergebnisse. Ein zweiter Dienst, /api/soap/countriesanmelden zum Anzeigen, liefert strukturierte Länderdatensätze. Beide sind kostenlos, ohne Anmeldung und ohne API-Schlüssel.

RechnerLänder
EndpunktPOST /api/soap/calculatoranmelden zum AnzeigenPOST /api/soap/countriesanmelden zum Anzeigen
WSDLGET /api/soap/calculator?wsdlanmelden zum AnzeigenKeins. Ein GET auf den Endpunkt liefert ein JSON zur Nutzung und einen Beispiel-Envelope
Namespacehttp://tempuri.org/http://example.com/countries
OperationenAdd, Subtract, Multiply, Divide (Ganzzahlen)GetCountryInfo(countryCode), ListCountries()
VersionenSOAP 1.1 und 1.2SOAP 1.1 und 1.2

Mit curl aufrufen (SOAP 1.1)

SOAP 1.1 nutzt Content-Type: text/xml und einen Header SOAPAction, der die Operation nennt. Hier ist der Header optional, aber wenn du ihn sendest, muss er zur Operation im Body passen.

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>'
Dieses Beispiel nutzt Endpunkte für angemeldete Mitglieder.AnmeldenKostenloses Konto erstellen
Antwort
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 und Faults

SOAP 1.2 nutzt Content-Type: application/soap+xml, einen anderen Envelope-Namespace und keinen Header SOAPAction. Die Antwort kommt in derselben Version zurück wie der Request. Eine Division durch null liefert einen Receiver-Fault:

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>'
Dieses Beispiel nutzt Endpunkte für angemeldete Mitglieder.AnmeldenKostenloses Konto erstellen
Antwort
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>

Die Regeln für Faults folgen den Spezifikationen, und genau dagegen muss ein Client getestet werden:

FallSOAP 1.1SOAP 1.2
Falsche Eingabe (unbekannter Ländercode)500, faultcode soap:Client400, Code soap:Sender
Serverseitiger Fehler (Division durch null)500, faultcode soap:Server500, Code soap:Receiver
SOAPAction nennt eine andere Operation500-FaultEntfällt
Falscher Content-Type (z. B. JSON)415 mit einem JSON-Fehler415 mit einem JSON-Fehler

Aus einem SOAP-Client nutzen

SoapUI

  1. Wähle File, dann New SOAP Project.
  2. Füge https://api.testingapis.com/api/soap/calculator?wsdlanmelden zum Anzeigen als Initial WSDL ein und schließ ab. SoapUI legt für jede Operation in beiden Bindings einen Request an.
  3. Öffne einen Request, trag intA und intB ein und führ ihn aus.

Python mit zeep

zeep liest das WSDL und baut daraus einen typisierten Client, und SOAP Faults werden zu Python-Ausnahmen:

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)
Dieses Beispiel nutzt Endpunkte für angemeldete Mitglieder.AnmeldenKostenloses Konto erstellen
Ausgabe
8
42
Fault Attempted to divide by zero.

JavaScript mit fetch

Ohne SOAP-Bibliothek ist ein Request ein XML-String, und das Ergebnis wird aus dem Antworttext gelesen:

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
Dieses Beispiel nutzt Endpunkte für angemeldete Mitglieder.AnmeldenKostenloses Konto erstellen

Der Länderdienst

Der Rechner liefert nur Zahlen. Um das Parsen verschachtelter Datensätze zu testen, nimm den Länderdienst. Er kennt 10 Länder (US, GB, IN, DE, FR, JP, BR, CA, AU und ZA). ListCountries liefert Codes und Namen, GetCountryInfo einen vollständigen Datensatz:

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>'
Dieses Beispiel nutzt Endpunkte für angemeldete Mitglieder.AnmeldenKostenloses Konto erstellen
Antwort-Body (in 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>

Ein unbekannter Code liefert einen Client-Fault:

Antwort für countryCode ZZ
HTTP/1.1 500 Internal Server Error

<soap:Fault>
  <faultcode>soap:Client</faultcode>
  <faultstring>Country code 'ZZ' not found.</faultstring>
</soap:Fault>

Verwandte APIs

Die Referenz der SOAP-API listet jede Operation mit sendefertigen Envelopes. Um einen Client zu testen, der XML über normales REST verarbeitet, probier die XML-Benutzer-API. Der Konverter von JSON zu XML hilft beim Vergleich eines SOAP-Inhalts mit seinem JSON-Gegenstück. Um SOAP von Grund auf zu lernen, mit WSDL, Faults, XPath und einer Java-Testsuite, folge dem Tutorial zu SOAP und XML (auf Englisch).