Una API SOAP gratuita para pruebas, con WSDL
Un servicio de calculadora con WSDL y un servicio de países, los dos con respuestas en SOAP 1.1 y 1.2.
Ejemplos ejecutados por última vez contra la API el
Si buscas una API SOAP pública contra la que probar un cliente, usa https://api.testingapis.com/api/soap/calculatorinicia sesión para verlo. Su WSDL está en https://api.testingapis.com/api/soap/calculator?wsdlinicia sesión para verlo, y SoapUI, Postman, WCF y zeep de Python pueden importarlo. Tiene cuatro operaciones: Add, Subtract, Multiply y Divide. Acepta SOAP 1.1 y SOAP 1.2 y devuelve SOAP faults de verdad, así que puedes probar errores además de resultados. Un segundo servicio, /api/soap/countriesinicia sesión para verlo, devuelve registros de países estructurados. Los dos son gratuitos, sin registro y sin clave de API.
| Calculadora | Países | |
|---|---|---|
| Endpoint | POST /api/soap/calculatorinicia sesión para verlo | POST /api/soap/countriesinicia sesión para verlo |
| WSDL | GET /api/soap/calculator?wsdlinicia sesión para verlo | No tiene. Haz GET al endpoint para ver un JSON de uso y un sobre de ejemplo |
| Namespace | http://tempuri.org/ | http://example.com/countries |
| Operaciones | Add, Subtract, Multiply, Divide (enteros) | GetCountryInfo(countryCode), ListCountries() |
| Versiones | SOAP 1.1 y 1.2 | SOAP 1.1 y 1.2 |
Llamarla con curl (SOAP 1.1)
SOAP 1.1 usa Content-Type: text/xml y una cabecera SOAPAction que nombra la operación. Aquí la cabecera es opcional, pero si la envías tiene que coincidir con la operación del cuerpo.
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 y faults
SOAP 1.2 usa Content-Type: application/soap+xml, otro namespace de sobre y ninguna cabecera SOAPAction. La respuesta vuelve en la misma versión que la petición. Dividir entre cero devuelve un fault de tipo 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>Las reglas de los faults siguen las especificaciones, que es justo contra lo que hay que probar un cliente:
| Caso | SOAP 1.1 | SOAP 1.2 |
|---|---|---|
| Entrada mala (código de país desconocido) | 500, faultcode soap:Client | 400, Code soap:Sender |
| Error del servidor (dividir entre cero) | 500, faultcode soap:Server | 500, Code soap:Receiver |
| SOAPAction nombra otra operación | Fault 500 | No aplica |
| Content-Type incorrecto (p. ej. JSON) | 415 con un error JSON | 415 con un error JSON |
Usarla desde un cliente SOAP
SoapUI
- Elige File y luego New SOAP Project.
- Pega
https://api.testingapis.com/api/soap/calculator?wsdlinicia sesión para verlo como WSDL inicial y termina. SoapUI crea una petición para cada operación en los dos bindings. - Abre una petición, rellena
intAeintBy ejecútala.
Python con zeep
zeep lee el WSDL y construye con él un cliente tipado, y los SOAP faults se convierten en excepciones de 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 con fetch
Sin una librería SOAP, una petición es una cadena XML y el resultado se saca del texto de la respuesta:
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 42El servicio de países
La calculadora solo devuelve números. Para probar el análisis de registros anidados, usa el servicio de países. Tiene 10 países (US, GB, IN, DE, FR, JP, BR, CA, AU y ZA). ListCountries devuelve códigos y nombres, y GetCountryInfo devuelve un registro completo:
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 código desconocido devuelve un fault de cliente:
HTTP/1.1 500 Internal Server Error
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Country code 'ZZ' not found.</faultstring>
</soap:Fault>APIs relacionadas
La referencia de la API SOAP lista cada operación con sobres listos para enviar. Para probar un cliente que consume XML sobre REST normal, prueba la API de usuarios en XML. El conversor de JSON a XML ayuda a comparar un contenido SOAP con su equivalente en JSON. Para aprender SOAP desde el principio, con WSDL, faults, XPath y una suite de tests en Java, sigue el tutorial de SOAP y XML (en inglés).