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.
| Calculadora | Países | |
|---|---|---|
| Endpoint | POST /api/soap/calculatorentre para ver | POST /api/soap/countriesentre para ver |
| WSDL | GET /api/soap/calculator?wsdlentre para ver | Não tem. Faça GET no endpoint para ver um JSON de uso e um envelope de exemplo |
| Namespace | http://tempuri.org/ | http://example.com/countries |
| Operações | Add, Subtract, Multiply, Divide (inteiros) | GetCountryInfo(countryCode), ListCountries() |
| Versões | SOAP 1.1 e 1.2 | SOAP 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.
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 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:
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>As regras dos faults seguem as especificações, que é exatamente o que um cliente precisa ter como referência nos testes:
| Caso | SOAP 1.1 | SOAP 1.2 |
|---|---|---|
| Entrada ruim (código de país desconhecido) | 500, faultcode soap:Client | 400, Code soap:Sender |
| Erro no servidor (divisão por zero) | 500, faultcode soap:Server | 500, Code soap:Receiver |
| SOAPAction com outra operação | Fault 500 | Não se aplica |
| Content-Type errado (por exemplo, JSON) | 415 com um erro JSON | 415 com um erro JSON |
Usar a partir de um cliente SOAP
SoapUI
- Escolha File e depois New SOAP Project.
- 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. - Abra uma requisição, preencha
intAeintBe 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:
# 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 com fetch
Sem uma biblioteca SOAP, a requisição é uma string XML e o resultado é tirado do texto da resposta:
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 42O 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:
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>Um código desconhecido devolve um 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
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).