Uma API SOAP gratuita para testes, com WSDL

Um serviço de calculadora com WSDL e um serviço de países, os dois respondendo em SOAP 1.1 e 1.2.

Exemplos executados pela última vez contra a API em

Para ter uma API SOAP pública contra a qual testar um cliente, use https://api.testingapis.com/api/soap/calculatorentre para ver. O WSDL dela fica em https://api.testingapis.com/api/soap/calculator?wsdlentre para ver, e SoapUI, Postman, WCF e o zeep do Python conseguem importá-lo. Ela tem quatro operações: Add, Subtract, Multiply e Divide. Aceita SOAP 1.1 e SOAP 1.2 e devolve SOAP faults de verdade, então você testa erros além de resultados. Um segundo serviço, /api/soap/countriesentre para ver, devolve registros estruturados de países. Os dois são gratuitos, sem cadastro e sem chave de API.

CalculadoraPaíses
EndpointPOST /api/soap/calculatorentre para verPOST /api/soap/countriesentre para ver
WSDLGET /api/soap/calculator?wsdlentre para verNão tem. Faça GET no endpoint para ver um JSON de uso e um envelope de exemplo
Namespacehttp://tempuri.org/http://example.com/countries
OperaçõesAdd, Subtract, Multiply, Divide (inteiros)GetCountryInfo(countryCode), ListCountries()
VersõesSOAP 1.1 e 1.2SOAP 1.1 e 1.2

Chamar com curl (SOAP 1.1)

O SOAP 1.1 usa Content-Type: text/xml e um cabeçalho SOAPAction com o nome da operação. Aqui o cabeçalho é opcional, mas se você enviar, ele precisa bater com a operação do corpo.

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 exemplo usa endpoints para membros conectados.EntrarCriar uma conta gratuita
Resposta
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 e faults

O SOAP 1.2 usa Content-Type: application/soap+xml, outro namespace de envelope e nenhum cabeçalho SOAPAction. A resposta volta na mesma versão da requisição. Dividir por zero devolve um fault do 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 exemplo usa endpoints para membros conectados.EntrarCriar uma conta gratuita
Resposta
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>

As regras dos faults seguem as especificações, que é exatamente o que um cliente precisa ter como referência nos testes:

CasoSOAP 1.1SOAP 1.2
Entrada ruim (código de país desconhecido)500, faultcode soap:Client400, Code soap:Sender
Erro no servidor (divisão por zero)500, faultcode soap:Server500, Code soap:Receiver
SOAPAction com outra operaçãoFault 500Não se aplica
Content-Type errado (por exemplo, JSON)415 com um erro JSON415 com um erro JSON

Usar a partir de um cliente SOAP

SoapUI

  1. Escolha File e depois New SOAP Project.
  2. Cole https://api.testingapis.com/api/soap/calculator?wsdlentre para ver como WSDL inicial e conclua. O SoapUI cria uma requisição para cada operação nos dois bindings.
  3. Abra uma requisição, preencha intA e intB e execute.

Python com zeep

O zeep lê o WSDL e monta a partir dele um cliente tipado, e os SOAP faults viram exceções do 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 exemplo usa endpoints para membros conectados.EntrarCriar uma conta gratuita
Saída
8
42
Fault Attempted to divide by zero.

JavaScript com fetch

Sem uma biblioteca SOAP, a requisição é uma string XML e o resultado é tirado do texto da resposta:

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 exemplo usa endpoints para membros conectados.EntrarCriar uma conta gratuita

O serviço de países

A calculadora só devolve números. Para testar a leitura de registros aninhados, use o serviço de países. Ele tem 10 países (US, GB, IN, DE, FR, JP, BR, CA, AU e ZA). ListCountries devolve códigos e nomes, e GetCountryInfo devolve um 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 exemplo usa endpoints para membros conectados.EntrarCriar uma conta gratuita
Corpo da resposta (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>

Um código desconhecido devolve um fault de cliente:

Resposta 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

A referência da API SOAP lista cada operação com envelopes prontos para enviar. Para testar um cliente que consome XML por REST comum, experimente a API de usuários em XML. O conversor de JSON para XML ajuda a comparar um conteúdo SOAP com o equivalente em JSON. Para aprender SOAP do zero, com WSDL, faults, XPath e uma suíte de testes em Java, siga o tutorial de SOAP e XML (em inglês).