Consultando CEP via WebService


 Ol√° Internautas, gostaria de mostrar hoje como utilizar webservice para consultar CEP pelo seu sistema, site ou aplicativo m√≥vel sem criar o "ADD References" da ferramenta Visual Studio .NET.
 
Referências:
Linguagem: C#
Ferramenta Visual Studio .NET 2008, 2010
Tecnologia: WebService

 Continuando a explica√ß√£o, existe um endere√ßo na internet que voc√™ passa o cep e retorna um xml como valor de consulta. O que fiz foi, pegar esse endere√ßo e construir um webservice relacionado para uso de qualquer tipo de software que tenha acesso ao endere√ßo.
 
 √Č l√≥gico que, em caso de problema o retorno ser√° NULL de acordo com o WebService. Voc√™ pode programar isso facilmente. N√£o vou utilizar o Add References da ferramenta, vou usar um outro componente para pegar a URL e consumir o seu retorno.

 √Č preciso dizer tamb√©m que, a seguran√ßa no uso de webservice √© imprescind√≠vel e por isso, usei uma maneira simples de se verificar a seguran√ßa no momento do uso, ou seja, para quem vai utilizar o servi√ßo.
 
 A primeira coisa foi definir a URL dentro do arquivo de configura√ß√£o da aplica√ß√£o, dentro do Web.config. Code 1.1

//web.config
<appSettings>
 <add key="Chave" value="8cbf1013-d6fd-4b68-8208-c29734fda911"/>
 <add key="Url" value="http://cep.republicavirtual.com.br/web_cep.php?cep={0}"/>
</appSettings>
Referência: Code 1.1
 
 Note que coloquei uma Chave e uma Url como key no arquivo. Como mensionado anteriormente, vou colocar uma m√≠nima seguran√ßa para utiliza√ß√£o do WebService e para isso vou usar essa Chave.
 
 O segundo passo foi criar a classe de webservice e fazer a pesquisa usando a Url do arquivo. Code 1.2

//classe .cs do webservice
using System;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using System.Net;
using System.Data;
using System.Xml;
using System.Configuration;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class ConsultaCEP : System.Web.Services.WebService
{
    public ConsultaCEP(){}

    public AuthHeader sHeader;

    private bool AutenticarChave()
    {
        if (sHeader != null && sHeader.AccessKey.Equals(ConfigurationManager.AppSettings["Chave"]))
            return true;
        return false;
    }

    /*
     <?xml version="1.0" encoding="iso-8859-1" ?>
        <webservicecep>
        <resultado>1</resultado>
        <resultado_txt>sucesso - cep completo</resultado_txt>
        <uf>DF</uf>
        <cidade>Taguatinga</cidade>
        <bairro>Sul (√Āguas Claras)</bairro>
        <tipo_logradouro>Quadra</tipo_logradouro>
        <logradouro>Quadra 210</logradouro>
      </webservicecep>
     */
    [SoapHeader("sHeader")]
    [WebMethod]
    public string BuscarCEP(string cep)
    {
        if (!AutenticarChave())
            throw new Exception("Autentica√ß√£o inv√°lida");

        string url = String.Format(ConfigurationManager.AppSettings["Url"],cep);

        WebClient client = new WebClient();
        client.Credentials =  new NetworkCredential();

        string returnURL = client.DownloadString(url);

        DataSet dsXML = new DataSet();
        XmlDocument xml = new XmlDocument();
        xml.LoadXml(returnURL);
        dsXML.ReadXml(new XmlNodeReader(xml));

        if (dsXML.Tables.Count > 0 && dsXML.Tables[0].Rows.Count > 0 && dsXML.Tables[0].Rows[0]["resultado"].ToString().Equals("1"))
        {
            return returnURL;
        }
        else
        {
            //Consultar Na ATP
            return "";
        }
    }
}

public class AuthHeader : SoapHeader
{
    public string AccessKey;
}
Referência: Code 1.2

 Os tr√™s primeiros m√©todos dentro da classe √© referente a parte de autentica√ß√£o. O primeiro m√©todo √© um construtor da classe chamada ConsultCEP(). Code 1.3
 
 public ConsultaCEP(){}

    public AuthHeader sHeader;

    private bool AutenticarChave()
    {
        if (sHeader != null && sHeader.AccessKey.Equals(ConfigurationManager.AppSettings["Chave"]))
            return true;
        return false;
    }
 Refer√™ncia: Code 1.3
 
 O pr√≥ximo m√©todo, "public string BuscarCEP(string cep)", √© p√ļblico e recebe uma string com o n√ļmero do CEP. Dentro dele pego a url colocada no arquivo de configura√ß√£o e depois utilizo um WebClient para consultar e fazer download do conte√ļdo. Verifico se os dados chegaram e retorno a string. Code 1.2
 
 No final dessa classe, criei outra; isto mesmo; uma classe dentro da outra. A assinatura da classe √© um pouco diferente das outras. Usei SoapHeader e declarei uma vari√°vel p√ļblica dentro dela chamada AccessKey.
 
public class AuthHeader : SoapHeader
{
    public string AccessKey;
}
Referência: Code 1.4

 Funcionou muito bem a solu√ß√£o. Em um outro artigo mostro como consumir esse webservice. Espero ter ajudado e fico por aqui.