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.
| Rechner | Länder | |
|---|---|---|
| Endpunkt | POST /api/soap/calculatoranmelden zum Anzeigen | POST /api/soap/countriesanmelden zum Anzeigen |
| WSDL | GET /api/soap/calculator?wsdlanmelden zum Anzeigen | Keins. Ein GET auf den Endpunkt liefert ein JSON zur Nutzung und einen Beispiel-Envelope |
| Namespace | http://tempuri.org/ | http://example.com/countries |
| Operationen | Add, Subtract, Multiply, Divide (Ganzzahlen) | GetCountryInfo(countryCode), ListCountries() |
| Versionen | SOAP 1.1 und 1.2 | SOAP 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.
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 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:
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>Die Regeln für Faults folgen den Spezifikationen, und genau dagegen muss ein Client getestet werden:
| Fall | SOAP 1.1 | SOAP 1.2 |
|---|---|---|
| Falsche Eingabe (unbekannter Ländercode) | 500, faultcode soap:Client | 400, Code soap:Sender |
| Serverseitiger Fehler (Division durch null) | 500, faultcode soap:Server | 500, Code soap:Receiver |
| SOAPAction nennt eine andere Operation | 500-Fault | Entfällt |
| Falscher Content-Type (z. B. JSON) | 415 mit einem JSON-Fehler | 415 mit einem JSON-Fehler |
Aus einem SOAP-Client nutzen
SoapUI
- Wähle File, dann New SOAP Project.
- 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. - Öffne einen Request, trag
intAundintBein 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:
# 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 mit fetch
Ohne SOAP-Bibliothek ist ein Request ein XML-String, und das Ergebnis wird aus dem Antworttext gelesen:
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 42Der 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:
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>Ein unbekannter Code liefert einen Client-Fault:
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).