Atualmente, podemos obter praticamente qualquer tipo de informação na Internet graças a evolução da tecnologia que disponibiliza diversas APIs ou web services oferecendo todo o tipo de informação. Dentre essas APIs e serviços, a API do Google se destaca pela sua versatilidade e abrangência.
Neste artigo vou mostrar como podemos obter o CEP de um endereço usando a API do Google em uma aplicação Windows Forms, usando a linguagem VB .NET. Para isso, vou fazer o download das informações usando a classe WebClient.
A classe WebClient do namespace System.NET pode ser usada em uma aplicação VB para efetuar o download e upload de arquivos na Internet. Ela é uma alternativa à classe WebRequest que usamos para mostrar como fazer download via HTTP no artigo VB.NET – Fazendo o download de páginas via HTTP.
A classe WebClient fornece métodos para enviar ou receber dados de qualquer recurso identificado pela URI – seja local, intranet ou Internet. Ela, na verdade, usa a classe WebRequest para fornecer acesso aos recursos da Internet. Instâncias da classe WebClient podem acessar dados com qualquer WebRequest registrados com o método WebRequest.RegisterPrefix.
A plataforma .NET Framework suporta por padrão URIs que começam com http, https e file:schema.
A classe WebClient fornece quatro métodos para fazer o envio de arquivos para um recurso:
- OpenWrite – retorna um Stream usado para enviar dados para um recurso;
- UploadData – envia um array de byte para o recurso e retorna um array de byte contendo qualquer resposta;
- UploadFile – envia um arquivo local para um recurso e retorna um array de btye contendo qualquer resposta;
- UploadValues – envia um NameValueCollection para o recurso e retorna um array de byte contendo qualquer resposta.
A classe WebClient fornece três métodos para fazer o download de arquivos a partir de um recurso:
- DownloadData – efetua o download de dados de um recurso e retorna um array de byte;
- DownloadFile – faz o download de dados de um recurso para um arquivo local;
- OpenRead – retorna os dados de um recurso com um Stream.
Nota: Para saber mais sobre os métodos, clique no link para ir para o site da MSDN.
Uma instância da classe WebClient não envia um cabeçalho HTTP opcional por padrão. Se sua requisição requerer um cabeçalho opcional, você precisa incluir o cabeçalho na coleção Headers.
Recursos usados: Visual Studio Express 2013 for Windows desktop e API Do Google.
Criando o projeto no Visual Studio 2013 Express
Abra o VS Express 2013 for Windows desktop e clique em New Project. A seguir, selecione a linguagem Visual Basic e o template Windows Forms Application. Informe o nome CEP_Google_VBNET e clique no botão OK:
A seguir vamos incluir, a partir da ToolBox, os seguintes controles no formulário form1.vb do projeto:
- 4 Labels
- 3 TextBox : txtEndereco, txtCidade, txtCEP
- 1 Combobox : cboUF
- 3 Button : bntGetCep, btnLimpar e btnSair
- 1 PictureBox : picImagem
Disponha os controles conforme o leiaute da figura abaixo:
A seguir vamos declarar os seguintes namespaces no formulário form1.vb:
Imports System.Net Imports System.Xml Imports System.IO
No evento Click do botão – Obter CEP – inclua o código abaixo:
Private Sub btnGetCEP_Click(sender As Object, e As EventArgs) Handles btnGetCEP.Click If String.IsNullOrEmpty(txtEndereco.Text) Then MessageBox.Show("Informe o endereço") Return End If If String.IsNullOrEmpty(txtCidade.Text) Then MessageBox.Show("Informe a cidade") Return End If If String.IsNullOrEmpty(cboUF.Text) Then MessageBox.Show("Informe o estado") Return End If txtCEP.Text = GetcodigoCEP(txtEndereco.Text, txtCidade.Text, cboUF.Text) End Sub
O código acima está validando as informações do endereço informadas pelo usuário. Elas serão usadas para chamar ao método GetCodigoCEP() e não são obrigatórias.
O código do método GetCodigoCEP() é dado abaixo:
Public Function GetcodigoCEP(ByVal address1 As String, ByVal city As String, ByVal state As String) As String Dim enderecoXML As String = String.Empty Dim codigoCEP As String = String.Empty Try 'Cria um objeto do tipo web client Dim wsClient As New WebClient() 'Constroi a URL concatenando os valores dos endereços Dim codigoCEPurl As String = "?address={0},+{1},+{2}&sensor=false" 'Aqui na construção da URL , sensor é obrigatório e indica se a requisição vem de um dispositivo com localização por sensor Dim url As String = "http://maps.googleapis.com/maps/api/geocode/xml" & codigoCEPurl url = String.Format(url, address1.Replace(" ", "+"), city.Replace(" ", "+"), state.Replace(" ", "+")) 'Download os dados no formato XML como uma string enderecoXML = wsClient.DownloadString(url) 'verifica se o status esta OK e inicia o processamento If enderecoXML.Contains("OK") Then 'Verifica se a seção postal_code existe na string e continua If enderecoXML.Contains("postal_code") Then Dim xmlDoc As New XmlDocument() xmlDoc.LoadXml(enderecoXML) Dim m_nodelist As XmlNodeList 'Obtem a lista de todos os endereço dos nós address_companent nodes m_nodelist = xmlDoc.SelectNodes("/GeocodeResponse/result/address_component") 'Para cada componente verifica a seção type para obter o cep For Each m_node In m_nodelist 'Pega o valor do elemento zipLongName Dim zipLongName = m_node.ChildNodes.Item(0).InnerText 'Pega o valor do elemento zipShortName Dim zipShortName = m_node.ChildNodes.Item(1).InnerText 'Pega o valor do elemento tipo de cep Dim zipType = m_node.ChildNodes.Item(2).InnerText 'Se o tipo do componente for postal_code ou postal_code_prefix pega o CEP como zipLongName If zipType = "postal_code_prefix" Or zipType = "postal_code" Then codigoCEP = zipLongName End If Next End If End If Catch ex As WebException MessageBox.Show(ex.Message) End Try Return codigoCEP End Function
O código acima monta uma URL usando os dados do endereço informados e chama a API do Google para obter informações do endereço.
A seguir, usamos a classe webClient para fazer o download das informações da API do GooGle no formato XML.
Para visualizar o XML ponha um breakpoint na linha onde estamos fazendo o download das informações na variável enderecoXML e escolha a forma como deseja visualizar as informações.
Abaixo temos um exemplo de um XML retornado pela API no formato texto com base em um endereço informado: Av. Paulista, 1000, São Paulo, SP.
<?xml version="1.0" encoding="UTF-8"?> <GeocodeResponse> <status>OK</status> <result> <type>street_address</type> <formatted_address>Paulista Avenue, 100 - Bela Vista, São Paulo - São Paulo, Brazil</formatted_address> <address_component> <long_name>100</long_name> <short_name>100</short_name> <type>street_number</type> </address_component> <address_component> <long_name>Paulista Avenue</long_name> <short_name>Paulista Avenue</short_name> <type>route</type> </address_component> <address_component> <long_name>Bela Vista</long_name> <short_name>Bela Vista</short_name> <type>neighborhood</type> <type>political</type> </address_component> <address_component> <long_name>São Paulo</long_name> <short_name>São Paulo</short_name> <type>locality</type> <type>political</type> </address_component> <address_component> <long_name>São Paulo</long_name> <short_name>São Paulo</short_name> <type>administrative_area_level_2</type> <type>political</type> </address_component> <address_component> <long_name>São Paulo</long_name> <short_name>SP</short_name> <type>administrative_area_level_1</type> <type>political</type> </address_component> <address_component> <long_name>Brazil</long_name> <short_name>BR</short_name> <type>country</type> <type>political</type> </address_component> <address_component> <long_name>01310</long_name> <short_name>01310</short_name> <type>postal_code_prefix</type> <type>postal_code</type> </address_component> <geometry> <location> <lat>-23.5706704</lat> <lng>-46.6449151</lng> </location> <location_type>RANGE_INTERPOLATED</location_type> <viewport> <southwest> <lat>-23.5720257</lat> <lng>-46.6462702</lng> </southwest> <northeast> <lat>-23.5693277</lat> <lng>-46.6435723</lng> </northeast> </viewport> <bounds> <southwest> <lat>-23.5706830</lat> <lng>-46.6449274</lng> </southwest> <northeast> <lat>-23.5706704</lat> <lng>-46.6449151</lng> </northeast> </bounds> </geometry> </result> </GeocodeResponse>
Após obter o XML, usamos os recursos do namespace System.XML para localizar a seção postal_code e extrair a informação do CEP. Observe que dependendo do endereço informado, o valor pode vir incompleto. Assim, o endereço deve estar no formato correto.
No evento Load do formulário estamos carregando a combobox – cboUF, usando um arquivo texto que contém as siglas do estados:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim path As String = "C:\dados\estados.txt" cboUF.Items.AddRange(File.ReadAllLines(path)) cboUF.SelectedIndex = 0 End Sub
No evento Click do botão Limpar temos o código abaixo que limpa todos os TextBox do formulário:
Private Sub btnLimpar_Click(sender As Object, e As EventArgs) Handles btnLimpar.Click For Each ctl In Controls If TypeOf ctl Is TextBox Then ctl.Text = "" Next ctl End Sub
Executando o projeto e informando um endereço completo obtemos o CEP conforme abaixo:
Pegue o projeto completo aqui: CEP_Google_VBNET.zip