ASP.NET: Consultando Endereços por CEP dos Correios Utilizando as Classes HttpWebRequest e HttpWebResponse

Postado por Daniel Garcia às 07:54 QUARTA-FEIRA, 25 DE JANEIRO DE 2012

Vejo em muitos fóruns, posts de desenvolvedores procurando por Webservices e outras formas de incorporar a consulta de endereços por CEP em seus sistemas. No entanto são poucas as maneiras disponíveis de forma gratuita para alcançar tal tarefa.

Então resolvi estudar uma forma simples de conseguir tal informação e consumi-la em uma aplicação .NET.

Para isso é necessário utilizar as classes HttpWebRequest e HttpWebResponse, ambas pertencentes ao namespace System.Net.

Um breve descritivo: A classe HttpWebRequest permite que uma aplicação faça uma requisição à um site, acesse um site. Já a classe HttpWebResponse é responsável por receber/tratar a resposta a essa requisição. Tudo isso ocorre, da mesma forma de quanto estamos entrando em um site a partir de um browser.

Vamos ao que interessa!

Para ilustrar essa funcionalidade optei por uma página ASP.NET (Web Form) bastante simplificado. Contendo: 1 TextBox e 1 Button para informar e submeter a pesquisa pelo CEP e 1 Literal para exibir o HTML resultante da consulta efetuada ao site dos correios.

Tela de Pesquisa:

Segue código HTML do Web Form: 

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!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>Consulta de Endereos por CEP</title>
    </
head>
<
body>
    <form id="form1" runat="server">
        <div>
            <h2>Consulta de Endereos por CEP</h2>
            CEP:
            <asp:TextBox ID="TextBoxCEP" runat="server"></asp:TextBox>
            <asp:Button ID="ButtonConsulta" runat="server" Text="Consultar" OnClick="ButtonConsulta_Click" />
            <br /><br />
            <asp:Literal ID="LiteralResultado" runat="server"></asp:Literal>
        </div>
    </form>
</
body>
</
html>

Segue código fonte comentado passo a passo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.IO;
using System.Text;

public partial class _Default : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void ButtonConsulta_Click(object sender, EventArgs e)
    {
        this.CosultarCEP(TextBoxCEP.Text);
    }

    private void CosultarCEP(string cep)
    {
        // Efetua a requisio ao site passando o CEP como querystring
        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.buscacep.correios.com.br/servicos/dnec/consultaLogradouroAction.do?Metodo=listaLogradouro&CEP=" + cep + "&TipoConsulta=cep");
        int count;
        byte[] buf = new byte[1000];
        StringBuilder sb = new StringBuilder();
        string temp;

        // Recebe a resposta da requisio
        HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();

        // Transforma a requisio em um Stream
        Stream stream = httpWebResponse.GetResponseStream();

        // Carrega e despeja um buffer (array de bytes), apendando em um StringBuider enquanto o buffer não estiver vazio
        do
        {
            count = stream.Read(buf, 0, buf.Length);
            temp =
Encoding.Default.GetString(buf, 0, count).Trim();
            sb.Append(temp);

       
}
while (count > 0);

        // Converte o String Buider para String
        string html = sb.ToString();

        // Seleciona o String HTML de acordo com os delimitadores
        html = this.retornarHtml(html, "<?xml version = '1.0' encoding = 'ISO-8859-1'?>", "<table width=\"645\">");
        // Exibe o HTML em um controle Literal
        LiteralResultado.Text = html; 
    }

    // Retorna o String HTML de acordo com os delimitadores
   
private string retornarHtml(string html, string delimitadorInicial, string delimitadorFinal)
    {
        int posInicial;
       
int posFinal;

        // Verifica se o delimitador inicial foi encontrado
        if (html.IndexOf(delimitadorInicial) != -1)
        {

            // Verifica a posio do delimitador inicial dentro do String HTML (soma a quantidade de caracteres do delimitador)
            posInicial = html.IndexOf(delimitadorInicial) + (delimitadorInicial.Length + 1);

            // Verifica a posio do ltimo caracter do delimitador final
            posFinal = html.IndexOf(delimitadorFinal, posInicial) - posInicial;

            // Retorna a String HTML de acordo com a posio inicial e a posio final
            html = html.Trim().Substring(posInicial, posFinal);

        }

        return html;

    }

}

Pronto! Agora basta executar a aplicação!

E válido ressaltar que o funcionamento deste mecanismo pode ser afetado caso haja alguma mudança na forma de consulta no site de onde origina a informação.

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

ASP.NET | C#

Aprenda com o MSDN Experience

Postado por Daniel Garcia às 09:41 DOMINGO, 12 DE JULHO DE 2009

O MSDN Experience On-Line foi desenvolvido com o intuito de oferecer a você um ambiente totalmente intuitivo para realização dos programas de treinamento do MSDN Brasil.

Primeiramente você deve conhecer os detalhes do conteúdo exposto e o funcionamento de seus módulos, depois você determina um cronograma pessoal de estudo (baixa o material de estudo e os vídeos). Quando você se sentir capaz, dever fazer as provas atestando seu conhecimento.

Para as provas concluídas com êxito e especialidades alcançadas você receberá ainda um certificado on-line que será acessado na página de provas disponíveis.

Viva essa experiência!

http://msdn.microsoft.com/pt-br/dd366110.aspx

4.0 ponto(s). Avaliado por 1 pessoas

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , ,

ASP.NET | C# | Treinamento | VB.NET

Calculando o Valor do SEDEX com ASP.NET

Postado por Daniel Garcia às 11:37 SÁBADO, 11 DE JULHO DE 2009

Neste post mostrarei um dica que é muito útil principalmente para quem está desenvolvendo um site de e-commerce, o cálculo do valor de envio via SEDEX dos Correios.

Os Correios disponibiliza em seu site uma URL que efetua o calculo prá você. Vou demostrar como implementamos isso dentro do ASP.NET.

Para isso seguiremos os seguintes passos:

1 - Crie um formulário com os seguintes campos: "Serviço", "CEP de Origem", "CEP Destino", "Peso", "Em Mãos", "Valor Declarado" e "Aviso de Recebimento".

A seguir, o Código do formulário:
       ...
      <table cellpadding="0" cellspacing="0">
            <tr>
                  <td>Serviço:&nbsp;&nbsp;</td>
                  <td>
                        <asp:DropDownList ID="ddlServico" runat="server">
                              <asp:ListItem Value="40010">SEDEX</asp:ListItem>
                              <asp:ListItem Value="40215">SEDEX 10</asp:ListItem>
                        </asp:DropDownList>
                  </td>
            </tr>
            <tr>
                  <td>CEP de Origem:&nbsp;&nbsp;</td>
                  <td><asp:TextBox ID="txtCEPOrigem" runat="server"></asp:TextBox></td>
            </tr>
            <tr>
                  <td>CEP de Destino:&nbsp;&nbsp;</td>
                  <td><asp:TextBox ID="txtCEPDesino" runat="server"></asp:TextBox></td>
            </tr>
            <tr>
                  <td>Peso:&nbsp;&nbsp;</td>
                  <td><asp:TextBox ID="txtPeso" runat="server" Width="80px"></asp:TextBox></td>
            </tr>
            <tr>
                  <td>Em Mãos:&nbsp;&nbsp;</td>
                  <td>
                        <asp:DropDownList ID="ddlEmMaos" runat="server">
                              <asp:ListItem Value="s">Sim</asp:ListItem>
                              <asp:ListItem Value="n">Não</asp:ListItem>
                        </asp:DropDownList>
                  </td>
            </tr>
            <tr>
                  <td>Valor Declarado:&nbsp;&nbsp;</td>
                  <td><asp:TextBox ID="txtValorDeclarado" runat="server"></asp:TextBox></td>
            </tr>
            <tr>
                  <td>Aviso Recebimento:&nbsp;&nbsp;</td>
                  <td>
                        <asp:DropDownList ID="ddlAvisoRecebimento" runat="server">
                              <asp:ListItem Value="s">Sim</asp:ListItem>
                              <asp:ListItem Value="n">Não</asp:ListItem>
                        </asp:DropDownList>
                  </td>
            </tr>
            <tr>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
            </tr>
            <tr>
                  <td>&nbsp;</td>
                  <td style="margin-left: 40px">
                        <asp:Button ID="btnCalcular" runat="server" Text="Calcular" onclick="btnCalcular_Click" style="height: 26px" />
                  </td>
            </tr>
            <tr>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
            </tr>
            <tr>
                  <td colspan="2">
                        <asp:Label ID="lblValor" runat="server" style="text-align: center"></asp:Label>
                  </td>
            </tr>
      </table>
       ...

* Observe os valores de cada ListItem dos DropDowLists "ddlServico", "ddlMaoPropria" e "ddlAvisoRecebimento". Eles devem permanecer os mesmo para que a consulta ocorra corretamente.

2 - Implemente o evento Click do botão "btnCalcular".

protected void btnCalcular_Click(object sender, EventArgs e)
{
        try
        {
               HttpWebRequest req;
               HttpWebResponse resp; 
               DataSet ds; 
               StreamReader sr;
// 1 - Atribui os valores dos campos a variáveis
string servico = ddlServico.SelectedValue;
string cepOrigem = txtCEPOrigem.Text;
string cepDestino = txtCEPDesino.Text;
string peso = txtPeso.Text;
string maopropria = ddlEmMaos.SelectedValue;
string avisorecebimento = ddlAvisoRecebimento.SelectedValue;

// 2 - Faz uma requisição a URL passando os valores selecionados via QueryString (resposta em XML)
req = (HttpWebRequest)WebRequest.Create("http://www.correios.com.br/encomendas/precos/calculo.cfm?" +
                                                            "Servico=" + servico + "&cepOrigem=" + cepOrigem + "&cepDestino=" + cepDestino +
                                                            "&peso=" + peso.Replace(",", ".") + "&MaoPropria=" + maopropria + 
                                                            "&AvisoRecebimento=" + avisorecebimento + "&resposta=xml");

// 3 - Armazena a resposta da requisição
resp = (HttpWebResponse)req.GetResponse();

// 4 - Converte a resposta (XML) da requisição para um StreamReader
sr = new StreamReader(resp.GetResponseStream(), System.Text.Encoding.UTF8); ds = new DataSet();

// 5 - Lê o StreamReader (XML) e carrega em um DataSet
ds.ReadXml(sr);

sr.Close();
resp.Close();

// 6 - Verifica se a consulta retornou erro
if (Convert.ToInt32(ds.Tables["erro"].Rows[0]["codigo"]) != 0)
{
      throw new Exception(ds.Tables["erro"].Rows[0]["descricao"].ToString());
}
// 7 - Caso a Consulta não tenha retornado erro, carrega o resultado no Label
else
{
      lblValor.Text = ds.Tables["Dados_Postais"].Rows[0]["preco_postal"].ToString().Replace(".", ",");
}

}
catch (Exception ex)

        lblValor.Text = ex.Message;
}

}

3 - Finalmente, está pronto. Ao clicar no botão "Calcular" o resultado será esse:

E ai, gostaram? Espero que esta dica seja útil prá vocês!

5.0 ponto(s). Avaliado por 2 pessoas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

ASP.NET | C# | E-Commerce

Desabilitando Dias do Final de Semana no Calendario do ASP.NET

Postado por Daniel Garcia às 09:36 SEXTA-FEIRA, 10 DE JULHO DE 2009

Alguns tipos de aplicação que utilizam o calendar como por exemplo agendas que trabalham somente com dias úteis, necessitam de tratamento para evitar que eventos sejam agendados nos finais de semana em outros dias não úteis.

Para desabilitar os finais de semana basta implementar o evento DayRender da seguinte maneira:

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
      if (e.Day.IsWeekend) 
      {
            e.Day.IsSelectable =
false;
      }
}

Muito simples, não?

Até a próxima e bons códigos!

5.0 ponto(s). Avaliado por 1 pessoas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

ASP.NET | C#

Adicionando um Web User Control em um Webform dinamicamente

Postado por Daniel Garcia às 16:23 QUINTA-FEIRA, 9 DE JULHO DE 2009

Neste post mostratei com é simples adicionar um User Control dinamicamente em um Webform.

Veja o código da página a seguir:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" %>
<!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></title>
</
head>
<
body>
      <form id="form1" runat="server">
      <div>
            <asp:Label ID="lblCabecalho" runat="server" Text="Label"></asp:Label>
            <asp:Label ID="lblRodape" runat="server" Text="Label"></asp:Label>
      </div>
      </form>
</
body>
</
html>

Para adicionar um User Control entre os labels "lblCabecalho" e "lblRodape" seguiremos os seguintes passos:

1 - Adicione um PlaceHolder entre os labels "lblCabecalho" e "lblRodape". O código ficará da seguinte forma:

...

<asp:Label ID="lblCabecalho" runat="server" Text="Label"></asp:Label>
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
<asp:Label ID="lblRodape" runat="server" Text="Label"></asp:Label>

...

2 - Use o método LoadControl para passando o nome do UserControl para carregá-lo. E adicione-o ao PlaceHolder.

protected void Page_Load(object sender, EventArgs e)
{
     Control ctrl = LoadControl("UserCtrl.ascx");

     PlaceHolder1.Controls.Add(ctrl);
}

Espero que tenham gostado!

5.0 ponto(s). Avaliado por 1 pessoas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

ASP.NET | C#

Sobre o Autor

Daniel Garcia - MCP, MCTS, MCPD
Meu nome é Daniel Garcia, venho atuando no mercado de tecnologia há mais de uma década. Durante esse tempo tive a oportunidade de trabalhar com diversas tecnologias, principalmente Microsoft. Conquistei os títulos: MCP, MCTS, MCDP e MCT. Desde então, venho contribuindo com toda a Comunidade, divulgando meu conhecimento das tecnologias Microsoft.