Desenvolvimento - ASP. NET

Consultando um cep via WebService e retornando um Endereço

Este artigo irá lhe mostrar como fazemos para consumir um webservice e retornar um endereço.

por Luiz Fernando



Este artigo está destinado, as pessoas que querem aprender um pouco sobre webservices e saber como que é feita a busca das informações de um cep nos correios.

Na verdade, o que vamos fazer é o seguinte:

1º - Caçar um webservice na internet, que consulte uma base dados e que retorne as informções necessárias que são:

- Logradouro
- Cidade
- Estado

2º - Consumir o webservice em nossa página.

Não precisaremos criar nenhum webservice, apenas consumir um já existente.

O passo 1, será destinado para as pessoas que não sabem utilizar um webservice, pois aqui iremos adicionar uma Web Reference ao nosso site. Web reference, é nada mais nada menos, que a referência do webservice em nossa aplicação.

Botão direito no site, e clique em Add Web Reference.

No campo url, iremos digitar a Url do webservice que retornará para a nossa aplicação, os dados do cep digitado, que no nosso caso será: http://www.bronzebusiness.com.br/webservices/wscep.asmx

Clique em Go.

No campo "Web Reference name:" digite o nome da referência que iremos chamar na nossa aplicação. Podemos digitar qualquer nome, mas por "padrão" o ideal é digitar WsCep, WsCorreios e etc...

Depois clique em Add Reference.

Note que no nosso arquivo de configuração "web.config", foi automaticamente adicionado uma entrada com a referência do webservice:

<appSettings>

<add key="WsCep.wscep" value="http://www.bronzebusiness.com.br/webservices/wscep.asmx"/>

</appSettings>

Vamos testar o nosso webservice ? Digite o endereço do Ws em seu browser:

Perceba, que neste caso, temos apenas um web método que é o cep. Então vamos clicar no link cep para testamos este web método.

Digite o cep, conforme informado:

Por padrão, a comunicação entre webservices, é feita através do protocolo SOAP, trafegando xml. Porém esse assunto está fora do escopo do artigo, inclusive pretendo escrever sobre tais assuntos em breve.

Comentei, pois, sei que muita gente ainda não conhece o conceito de webservices.

Vamos lá, clique em Invoke. Perceba que o retorno do método é um xml contendo os dados do endereço do qual o cep pertence. Na verdade este webservice, consultou uma base de dados, que pode ser um banco de dados, um xml, um csv ou até mesmo outro webservice e retornou esta estrutura xml:

<?xml version="1.0" encoding="utf-8" ?>

- <DataSet xmlns="http://tempuri.org/">

- <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

- <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">

- <xs:complexType>

- <xs:choice minOccurs="0" maxOccurs="unbounded">

- <xs:element name="tbCEP">

- <xs:complexType>

- <xs:sequence>

<xs:element name="logradouro" type="xs:string" minOccurs="0" />

<xs:element name="nome" type="xs:string" minOccurs="0" />

<xs:element name="bairro" type="xs:string" minOccurs="0" />

<xs:element name="UF" type="xs:string" minOccurs="0" />

<xs:element name="cidade" type="xs:string" minOccurs="0" />

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:choice>

</xs:complexType>

</xs:element>

</xs:schema>

- <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">

- <NewDataSet xmlns="">

- <tbCEP diffgr:id="tbCEP1" msdata:rowOrder="0">

<logradouro>Estrada</logradouro>

<nome>do Pinhao</nome>

<bairro>Freguesia</bairro>

<UF>RJ</UF>

<cidade>Rio de Janeiro</cidade>

</tbCEP>

</NewDataSet>

</diffgr:diffgram>

</DataSet>

Obs: EXISTEM MILHÕES DE WEBSERVICES NA INTERNET QUE RETORNAM UM ENDEREÇO. PROCURE O MAIS CONFIÁVEL E O MAIS ADEQUADO A SUA APLICAÇÃO.

LEMBRE-SE, ESTE WS, É APENAS PARA FINS DIDÁTICOS.

O segundo passo, será o seguinte:

Iremos criar uma classe que retornar os dados vindos do webservice. Na verdade, estamos organizando e/ou padronizando a forma de receber esses dados através de uma classe. Vamos lá

Botão direito em app_code ou no site e clique em Add New Item:

Selecione Class, e digite no campo Name: CepService.cs , q será a Nossa classe que retornará os dados do webservice.

Abaixo segue o código de duas classes, uma é a classe Endereco que possui os atributos que mantém os dados do Endereço e a outra é a CepService que consome o webservice e retorna o endereço para a nossa página:

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

/// <summary>

/// Classe Endereço, contem os atritubos de um endereço: Logradouro, Tipo, Bairro, Estado e Cidade.

/// </summary>

public class Endereco

{

private string _tipoLogradouro;

public string TipoLogradouro

{

get { return _tipoLogradouro; }

set { _tipoLogradouro = value; }

}

private string _logradouro;

public string Logradouro

{

get { return _logradouro; }

set { _logradouro = value; }

}

private string _bairro;

public string Bairro

{

get { return _bairro; }

set { _bairro = value; }

}

private string _uf;

public string UF

{

get { return _uf; }

set { _uf = value; }

}

private string _cidade;

public string Cidade

{

get { return _cidade; }

set { _cidade = value; }

}

public Endereco() { }

}

/// <summary>

/// Classe de serviço, que contém o método GetEndereço, que recebe um string de cep, do tipo "21911-020"

/// e retorna um objeto do tipo Endereco.

/// </summary>

public static class CepService

{

public static Endereco GetEndereco(string cep)

{

//Instanciado o meu webService

WsCep.wscep service = new WsCep.wscep();

//método cep(string c) que recebe uma string cep e retorna um dataset.

DataSet ds = service.cep(cep);

//instanciando um objeto do tipo endereço, no caso o objeto que será retornado.

Endereco en = new Endereco();

if (ds != null)

if (ds.Tables[0].Rows.Count > 0)

{

en.Bairro = ds.Tables[0].Rows[0]["bairro"].ToString();

en.Cidade = ds.Tables[0].Rows[0]["cidade"].ToString();

en.Logradouro = ds.Tables[0].Rows[0]["nome"].ToString();

en.TipoLogradouro = ds.Tables[0].Rows[0]["logradouro"].ToString();

en.UF = ds.Tables[0].Rows[0]["UF"].ToString();

}

//retornando o meu Objeto do tipo endereço.

return en;

}

}

Quanto a classe Endereco, acho que ficou tranqüilo para todo mundo, porém irei explicar o método GetEndereco(string cep) da classe CepService. Obs: Criei uma classe ESTÁTICA, pois não irei precisar instanciar a classe Service para que ela retorne o Endereco desejado.

Vamos lá:

- O método que é estático, recebe uma string do tipo "21911-010"

public static Endereco GetEndereco(string cep)

{

- Lembra do nome da referência do nosso webservice(WsCep) ? Então, agora iremos chamar o nosso Webservice WsCep.

WsCep.wscep service = new WsCep.wscep();

- O método cep(string cep) do webservice, retorna um dataset com os dados preenchidos.

DataSet ds = service.cep(cep);

- Instanciamos um objeto do tipo endereço, no caso o objeto que será retornado.

Endereco en = new Endereco();

- Verificamos se o ds está preenchido ou vazio

if (ds != null)

if (ds.Tables[0].Rows.Count > 0)

{

- Atribuimos os dados retornados do dataset ao nosso objeto

en.Bairro = ds.Tables[0].Rows[0]["bairro"].ToString();

en.Cidade = ds.Tables[0].Rows[0]["cidade"].ToString();

en.Logradouro = ds.Tables[0].Rows[0]["nome"].ToString();

en.TipoLogradouro = ds.Tables[0].Rows[0]["logradouro"].ToString();

en.UF = ds.Tables[0].Rows[0]["UF"].ToString();

}

- Retornamos o objeto do tipo endereço.

return en;

}

Feito isso, é só trabalharmos a lógica em nosso Web Form:

Crie um arquivo chamado teste.aspx, com o código abaixo:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Teste.aspx.cs" Inherits="Teste" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<title>Untitled Page</title>

</head>

<body>

<form id="form1" runat="server">

<div>

Cep:

<asp:TextBox ID="txtCep" runat="server" MaxLength="9"></asp:TextBox><asp:Button ID="btnConsultar"

runat="server" Text="Consultar Cep" OnClick="btnConsultar_Click" /><br />

Tipo:

<asp:TextBox ID="txtTipo" runat="server"></asp:TextBox><br />

Logradouro:

<asp:TextBox ID="txtLogradouro" runat="server"></asp:TextBox><br />

Estado:

<asp:TextBox ID="txtEstado" runat="server"></asp:TextBox><br />

Cidade:

<asp:TextBox ID="txtCidade" runat="server"></asp:TextBox><br />

Bairro:

<asp:TextBox ID="txtBairro" runat="server"></asp:TextBox><br />

</div>

</form>

</body>

</html>

e no teste.aspx.cs do web form, escreve o seguinte código:

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

public partial class Teste : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

}

protected void btnConsultar_Click(object sender, EventArgs e)

{

Endereco end = new Endereco();

if (txtCep.Text != string.Empty) {

end = CepService.GetEndereco(txtCep.Text);

txtCidade.Text = end.Cidade;

txtEstado.Text = end.UF;

txtTipo.Text = end.TipoLogradouro;

txtLogradouro.Text = end.Logradouro;

txtBairro.Text = end.Bairro;

}

}

}

Neste artigo, aprendemos a consumir um webservice, e retornar os dados dele vindo, utilizando uma prática diária que é a consulta de endereço baseado em um cep.

Segue as referências sobre os assuntos acima supracitados

http://www.microsoft.com/brasil/msdn/Tecnologias/webservices/web_services_4.aspx

http://thesource.ofallevil.com/brasil/msdn/Tecnologias/webservices/web_services_7.aspx

Mais uma vez agradeço a todos e espero ter ajudado.

Abraços []`ss !!!!

Luiz Fernando

Luiz Fernando