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.

CalculadoraPaíses
EndpointPOST /api/soap/calculatorinicia sesión para verloPOST /api/soap/countriesinicia sesión para verlo
WSDLGET /api/soap/calculator?wsdlinicia sesión para verloNo tiene. Haz GET al endpoint para ver un JSON de uso y un sobre de ejemplo
Namespacehttp://tempuri.org/http://example.com/countries
OperacionesAdd, Subtract, Multiply, Divide (enteros)GetCountryInfo(countryCode), ListCountries()
VersionesSOAP 1.1 y 1.2SOAP 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.

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>'
Este ejemplo usa endpoints para miembros con sesión iniciada.Iniciar sesiónCrear una cuenta gratuita
Respuesta
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:

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>'
Este ejemplo usa endpoints para miembros con sesión iniciada.Iniciar sesiónCrear una cuenta gratuita
Respuesta
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:

CasoSOAP 1.1SOAP 1.2
Entrada mala (código de país desconocido)500, faultcode soap:Client400, Code soap:Sender
Error del servidor (dividir entre cero)500, faultcode soap:Server500, Code soap:Receiver
SOAPAction nombra otra operaciónFault 500No aplica
Content-Type incorrecto (p. ej. JSON)415 con un error JSON415 con un error JSON

Usarla desde un cliente SOAP

SoapUI

  1. Elige File y luego New SOAP Project.
  2. 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.
  3. Abre una petición, rellena intA e intB y 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:

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)
Este ejemplo usa endpoints para miembros con sesión iniciada.Iniciar sesiónCrear una cuenta gratuita
Salida
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:

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
Este ejemplo usa endpoints para miembros con sesión iniciada.Iniciar sesiónCrear una cuenta gratuita

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

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>'
Este ejemplo usa endpoints para miembros con sesión iniciada.Iniciar sesiónCrear una cuenta gratuita
Cuerpo de la respuesta (dentro de 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 código desconocido devuelve un fault de cliente:

Respuesta para countryCode ZZ
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).