Você está na página 1de 9

Acessando os web services dos Correios com

C# e VB.NET (consulta de CEPs e preços)


andrealveslima | .NET, Software Development | 53
Hoje em dia é impossível pensar em uma aplicação comercial que não tenha algum campo para a
entrada de endereços em algum lugar do aplicativo. Dito isso, uma funcionalidade que podemos
implementar muito facilmente e que facilitaria a vida do usuário é o preenchimento do endereço
baseado no CEP. Antigamente isso só era possível através da compra de um banco de dados de
CEPs. Atualmente, com os web services dos Correios nós podemos facilmente fazer essa consulta
gratuitamente (pelo menos por enquanto). No artigo de hoje você vai conferir como acessar os web
services dos Correios com C# e VB.NET para consultarmos CEPs e calcularmos preços de
encomendas SEDEX ou PAC.

Quais são os web services disponibilizados pelos Correios?


No momento da escrita deste artigo (julho de 2016), os Correios disponibilizam quatro web
services:
Sistema de Gerenciamento de Postagens dos Correios (SIGEP): esse primeiro web service
possui métodos relacionados ao envio de encomendas, como geração de códigos para etiquetas,
busca de clientes e consulta de CEPs. A maioria dos métodos necessita que você tenha um contrato
com os Correios, porém, o método que vamos utilizar neste artigo (consulta de CEPs) não necessita
de autenticação.
Logística reversa: sinceramente não entendi para que serve esse web service. O pessoal que
entende de logística ou que trabalha com sistemas desse tipo deve entender. Se quiser deixar um
comentário explicando esse conceito, fique à vontade.
Rastreamento de objetos: como o próprio nome já diz, ele possibilita o rastreio de objetos com
base no código de 13 dígitos gerado pelos Correios. Não testei esse web service, mas, pelo que pude
observar na documentação, ele precisa de um usuário e senha.
Calculador de preços e prazos de encomendas: faz o cálculo do preço e prazo de entrega para
encomendas SEDEX e PAC. Se você não tiver um contrato com os Correios, ele também retornará
os valores, mas, o preço será baseado na tabela geral (o mesmo preço gerado para qualquer pessoa
através do site dos Correios).
Inacreditavelmente, existem documentos dos próprios Correios explicando a estrutura desses web
services. Eles não são lá muito detalhados, mas, já é um bom começo. Os web services do SIGEP,
logística reversa e rastreamento de objetos estão documentados aqui. Já o web service de cálculo de
preços e encomendas está documentado aqui.

Consultando um CEP
Edit: em Setembro de 2017 eu publiquei um vídeo mostrando o processo de consulta de CEPs com
os web services dos Correios. Caso você prefira a versão em vídeo, aqui vai ele:

O primeiro web service que vamos utilizar é o web service do SIGEP. Esse web service possui
diversos métodos, mas, o que mais nos interessa para este artigo é o método que retorna o endereço
correspondente a um CEP.
Para implementarmos essa consulta, vamos criar um novo projeto do tipo “Console Application“.
Nós poderíamos criar qualquer tipo de projeto (como Windows Forms, WPF, Web Forms ou MVC),
mas, para facilitar a nossa vida e focarmos diretamente nos web services, acredito que uma
“Console Application” seja o tipo ideal de projeto.
Uma vez criado o projeto, vamos adicionar a referência para o primeiro web service dos Correios.
Para isso, vá até o “Solution Explorer“, clique com o botão direito sobre “References” e escolha a
opção “Add Service Reference“:
Na janela que se abre, temos que entrar com a URL da definição do web service que queremos
acessar. No caso do web service do SIGEP, o endereço é o seguinte:
https://apps.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente?wsdl
Digite esse endereço na caixa “Address“, clique em “Go“, escolha o serviço “AtendeCliente“, dê o
nome de “WSCorreios” para a referência e clique em “OK”:

Pronto! Com isso já podemos acessar o web service para consultarmos o endereço relacionado a um
CEP. O código é extremamente simples. Primeiramente temos que criar uma instância do “client”
do web service e depois chamamos o método “consultaCEP” passando o CEP desejado. O resultado
será retornado em uma variável do tipo “enderecoERP“, que possui todas as propriedades do
endereço (como bairro, cidade, UF, etc):

' VB.NET
System.Console.Write("Digite o CEP: ")
1 Dim Valor = System.Console.ReadLine()
2 Try
3 Dim WS = New WSCorreios.AtendeClienteClient()
4 Dim Resposta = WS.consultaCEP(Valor)
5 System.Console.WriteLine()
6 System.Console.WriteLine("Endereço: {0}", Resposta.end)
7 System.Console.WriteLine("Complemento: {0}",
8 Resposta.complemento)
9 System.Console.WriteLine("Complemento 2: {0}",
10 Resposta.complemento2)
11 System.Console.WriteLine("Bairro: {0}", Resposta.bairro)
12 System.Console.WriteLine("Cidade: {0}", Resposta.cidade)
13 System.Console.WriteLine("Estado: {0}", Resposta.uf)
14 System.Console.WriteLine("Unidades de Postagem: {0}",
15 Resposta.unidadesPostagem)
16 Catch Ex As Exception
17 System.Console.WriteLine("Erro ao efetuar busca do CEP: {0}",
18 Ex.Message)
End Try
System.Console.ReadLine()
O CEP pode ser consultado tanto utilizando o hífen (exemplo 13484-339) ou sem hífen (13484339).
Veja os resultados das consultas, inclusive contendo alguns cenários em que passamos CEPs
inválidos para o serviço:
Calculando o preço e prazo de uma encomenda SEDEX ou
PAC
Agora que já vimos a utilização do serviço do SIGEP para consulta de CEPs, vamos ver como
podemos utilizar o outro web service dos Correios para fazermos o cálculo de uma encomenda
SEDEX ou PAC.
Primeiramente, temos que adicionar outra referência de serviço no nosso projeto, dessa vez
utilizando o nome “WSCorreiosPreco” e a seguinte URL:
http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx
Esse web service possui diversos métodos relacionados ao cálculo de preços e prazos de
encomendas. O método que vamos utilizar é o “CalcPrecoPrazo“, que retorna tanto o preço quanto
o prazo da encomenda. Esse método recebe várias informações, como o CEP de origem, CEP de
destino, dimensões da encomenda, etc. Entre esses parâmetros, dois merecem uma maior atenção:
tipo do envio e formato da encomenda.
O tipo de envio define qual serviço dos Correios que deverá ser utilizado para despachar a
encomenda (SEDEX Varejo, SEDEX 10, PAC, etc). As opções para este parâmetro são as seguintes:
Já o formato da encomenda define se a encomenda será despachada em uma caixa, rolo ou
envelope. As opções são as seguintes:

Por fim, os parâmetros referentes à entrega em mão própria e aviso de recebimento deverão ser
passados no formato S/N (“S” caso o serviço deva ser considerado no cálculo e “N” caso o serviço
não deva ser considerado).
Tendo em vista todas essas informações, o código para calcularmos o preço e prazo de uma
encomenda ficaria assim:

1 ' VB.NET
2 System.Console.Write("Digite o código do tipo de envio: ")
3 Dim TipoEnvio = System.Console.ReadLine()
4 System.Console.Write("Digite o CEP de origem: ")
5 Dim CepOrigem = System.Console.ReadLine()
6 System.Console.Write("Digite o CEP de destino: ")
7 Dim CepDestino = System.Console.ReadLine()
8 System.Console.Write("Digite o peso (kg): ")
9 Dim Peso = System.Console.ReadLine()
10 System.Console.Write("Digite o código do formato (caixa,
11 envelope, etc): ")
12 Dim CodigoFormato = System.Console.ReadLine()
13 System.Console.Write("Digite o comprimento: ")
14 Dim Comprimento = System.Console.ReadLine()
15 System.Console.Write("Digite a altura: ")
16 Dim Altura = System.Console.ReadLine()
17 System.Console.Write("Digite a largura: ")
18 Dim Largura = System.Console.ReadLine()
19 System.Console.Write("Digite o diâmetro: ")
20 Dim Diametro = System.Console.ReadLine()
21 System.Console.Write("Entrega em mão própria (S/N)?: ")
22 Dim MaoPropria = System.Console.ReadLine()
23 System.Console.Write("Digite o valor declarado: ")
24 Dim ValorDeclarado = System.Console.ReadLine()
25 System.Console.Write("Aviso de recebimento (S/N)?: ")
26 Dim AvisoRecebimento = System.Console.ReadLine()
27
28 Try
29 Dim CodigoFormatoInt As Integer
30 If (Not Integer.TryParse(CodigoFormato, CodigoFormatoInt))
31 Then
32 Throw New Exception("Código do formato inválido")
33 End If
34 Dim ComprimentoDecimal As Decimal
35 If (Not Decimal.TryParse(Comprimento, ComprimentoDecimal))
36 Then
37 Throw New Exception("Comprimento inválido")
38 End If
39 Dim AlturaDecimal As Decimal
40 If (Not Decimal.TryParse(Altura, AlturaDecimal)) Then
41 Throw New Exception("Altura inválida")
42 End If
43 Dim LarguraDecimal As Decimal
44 If (Not Decimal.TryParse(Largura, LarguraDecimal)) Then
45 Throw New Exception("Largura inválida")
46 End If
47 Dim DiametroDecimal As Decimal
48 If (Not Decimal.TryParse(Diametro, DiametroDecimal)) Then
Throw New Exception("Diâmetro inválido")
49
End If
50
Dim ValorDeclaradoDecimal As Decimal
51
If (Not Decimal.TryParse(ValorDeclarado,
52
ValorDeclaradoDecimal)) Then
53
Throw New Exception("Valor declarado inválido")
54
End If
55
56
Dim WS As New WSCorreiosPreco.CalcPrecoPrazoWSSoapClient()
57
Dim Resposta = WS.CalcPrecoPrazo(String.Empty, String.Empty,
58 TipoEnvio, CepOrigem, CepDestino, Peso, CodigoFormatoInt,
59 ComprimentoDecimal, AlturaDecimal, LarguraDecimal,
60 DiametroDecimal, MaoPropria, ValorDeclaradoDecimal,
61 AvisoRecebimento)
62 Dim RespostaReal = Resposta.Servicos.FirstOrDefault()
63 If (RespostaReal IsNot Nothing) Then
64 System.Console.WriteLine()
65 System.Console.WriteLine("Prazo: {0} dia",
66 RespostaReal.PrazoEntrega)
67 System.Console.WriteLine("Valor: R$ {0}",
RespostaReal.Valor)
Else
Throw New Exception("Não foi possível encontrar os valores
dentro da resposta do serviço")
End If
Catch Ex As Exception
System.Console.WriteLine("Erro ao efetuar cálculos: {0}",
Ex.Message)
End Try

System.Console.ReadLine()
Entretanto, se tentarmos executar o projeto nesse momento, receberemos o seguinte erro:

Esse erro acontece porque o serviço de cálculo de preços dos Correios adiciona dois EndPoints no
arquivo app.config: um utilizando SOAP e outro utilizando SOAP 1.2. Para consertar esse erro,
temos que comentar um dos EndPoints no arquivo app.config. Eu, por exemplo, comentei o
EndPoint referente ao SOAP 1.2:

Outra maneira de resolvermos esse problema sem alterarmos o app.config seria passarmos o nome
do EndPoint a ser utilizado no construtor do serviço.
Após fazermos essa alteração e executarmos a aplicação, conseguiremos calcular os preços e prazos
de entrega das encomendas:

Concluindo
Apesar de não encontrarmos muitos artigos detalhados sobre a utilização dos web services dos
Correios com C# e VB.NET, você conferiu neste artigo que essa tarefa não é lá tão difícil de ser
implementada. Basta sabermos os endereços dos web services, quais métodos utilizar e quais
parâmetros passar.
Você já precisou utilizar os web services dos Correios na sua aplicação? Como é que ficou o seu
código? Parecido com o código apresentado neste artigo ou você acabou fazendo de outra maneira?
Conte-nos mais detalhes na caixa de comentários!
Por fim, convido você a inscrever-se na minha newsletter. Ao fazer isso, você receberá um e-mail
toda semana sobre o artigo publicado e ficará sabendo também em primeira mão sobre o artigo da
próxima semana, além de receber dicas “bônus” que eu só compartilho por e-mail. Inscreva-se
utilizando o formulário logo abaixo.