Apesar da grande adoção de REST para a criação de webservices, ainda é muito comum (e necessário) termos que trocar mensagens com sistemas legados, inclusive em outras linguagens como Java e .NET, assim poder fazer em chamadas a endpoints SOAP se torna necessário muitas vezes.

Esta necessidade surgiu para mim quando vi que testar serviços em SOAP seria muito mais fácil ser feito em Python, devido sua sintaxe idiomática e scripts muito simples de serem construídos. Buscando nas “internets” eu descobri uma biblioteca chamada Zeep, que de tão simples que é o seu acesso não compensa nem discutir muito, mas já irmos direto ao código, utilizando o webservice dos Correios:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from zeep import Client

client = Client("http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx?WSDL")

# Essa chamada retorna uma list de dicts, bem interessante. 
# Se a entrada puder ser uma lista você poderá usar uma abordagem semelhante
servicos = client.service.ListaServicos()

print(servicos)

#Testando chamada com entrada com mais de um parametro.
entrada = {
    'nCdServico' : 40010,
    'sCepOrigem' : '01217010',
    'sCepDestino' : '69005000'
}

#Calculando o prazo de entrega para SEDEX
#Alguns serviços que já chamei aceitam o dicionario diretamente,
# mas este no caso foi necessário desempacotar, senão ele dá erro.
retorno = client.service.CalcPrazo(**entrada)

print(retorno)

Como podemos ver, é tudo muito simples, basta criarmos um objeto do tipo Client passando a string do WSDL e através de services temos acessos ao métodos do serviço. Tendo a necessidade de inspecionar o serviço podemos rodar o seguinte comando:

1
python -m zeep http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx?WSDL

Retornando assim os tipos e as operações do serviço.