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.