terça-feira, 17 de agosto de 2010

Busca de CEP com o Lazarus - Parte 2 - HTTPSend

Na primeira parte deste tutorial vimos como criar uma função para UrlEncode, ou seja, codificar uma Url para que substitua caracteres especiais por caracteres de escape tornando-a assim uma url válida.

Nesta segunda parte do nosso tutorial de busca de CEP com  o lazarus vamos dar uma breve introdução à classe THTTPSend da unit httpsend, biblioteca Synapse.

Para isso, crie um formulário com 3 edits (edCep, edChave e edUrl) e dois memos (mRequest e mResponse) que servirão, respectivamente, para digitar o CEP a ser procurado, a chave cadastrada no serviço http://www.buscarcep.com.br/. O edUrl será somente leitura e conterá a url composta depois de ter a chave codificada com urlEncode.

Os memos mRequest e mResponse mostrarão, respectivamente, informações do request (pedido) feito ao servidor web e a resposta deste.

Coloque um botão chamado btTesteHttpSend para codificarmos nosso exemplo. Ao final da montagem da form ela ficará como na figura 1:

Figura1 - form principal com 3 edits e dois memos
Não se esqueça de colocar a unit httpsend no uses da unit 1.

Por enquanto não vamos tratar sobre proxy, então, se sua conexão usar proxy recomendo a você usar outro computador / outra conexão ou conversar com o administrador da rede para que  o site http://www.buscarcep.com.br/ entre na lista de excessões do proxy e passe diretamente por ele.


O que precisamos fazer é compor a url como especificado no serviço, passando os parâmetros:
cep=[cep]
formato=xml
chave=[chave cadastrada] separados por "&". Poderemos atribuir a url concatenada à propriedade text do edUrl. 


Depois devemos criar um objeto THTTPSend e executar um comando GET na Url contida em edUrl.Text.


Caso obtivermos sucesso a propriedade Document do HTTPSend terá um stream com todos os bytes que o servidor nos respondeu, no caso um XML, mas poderia ser uma página html, uma imagem etc.


Os principais comandos do protocolo HTTP são GET (que "pede" por dados) e o POST (que envia dados). Quando usamos um Browser, por exemplo, usamos GET sempre que digitamos uma URL ou que usamos uma tag img e esta tem uma url que aponta para uma imagem. Aliás, todas as tags que contem uma URL farão novos gets. Um POST é feito sempre que se preenche e envia um formulário. 


Podemos nos comunicar usando  o protocolo HTTP mesmo sem usar um browser, usando os comandos GET e POST. Além disso, há outros protocolos que podem ser "encapsulados" dentro de HTTP para outras finalidades, por exemplo os SOAP Webservices, que encapsulam dados em um envelope  SOAP e enviam para o servidor através de um POSt. Há outras formas de se fazer webservices mas não vamos discuti-las aqui. 


A cada requisição (mensagem GET ou POST enviada pelo browser ou outro programa) enviada para o servidor este pode responder com um número de status ou ResultCode. 


Uma descrição completa de como funciona o protocolo HTTP pode ser visto na wikipedia ou no W3C

O código para criar a requisição e consultar o site encontra-se abaixo:

procedure TForm1.btTesteClick(Sender: TObject);
var
  HTTP: THTTPSend;
  sucesso: boolean;
begin

  sucesso := false;
  HTTP := THTTPSend.Create;
  try

    edUrl.Text:= 'http://www.buscarcep.com.br/?' + 'cep='+edCep.Text+'&formato=xml&chave='+UrlEncode('1Z3s3/2ZjDt.dcyiLuBy/6mitlDNgt/');
    sucesso := HTTP.HTTPMethod('GET', edUrl.Text);
    mResquest.Lines.Add('URL: ' + edUrl.Text);
    mResquest.Lines.add('---------------------');
    mResquest.Lines.Add(HTTP.Headers.Text);
    mResquest.Lines.add('---------------------');
    mResquest.Lines.add(HTTP.ResultString);
    mResquest.Lines.add(inttostr( HTTP.ResultCode));

    if sucesso then
    begin
        HTTP.Document.Seek(0, soFromBeginning);
        mResponse.Lines.LoadFromStream(HTTP.Document);
    end;
  finally
    HTTP.Free;
  end;
end;  


Como vimos, a cada ação que fazemos jogamos um registro no mRequest para termos um log, no entanto as linhas mResquest.Lines.Add(HTTP.Headers.Text); e mResquest.Lines.add(inttostr( HTTP.ResultCode)); são as mais importantes porque nos mostram os cabeçalhos http enviados e o resultado, respectivamente.

O resultado que esperamos é OK 200. Há uma série de outros resultados que você pode consultar aqui no W3C.

Como resultado da execução, deverá aparecer no seu memo mRequest o seguinte:


"Conversas" HTTP:
============
URL: http://www.buscarcep.com.br/?cep=01136-001&formato=xml&chave=1Z3s3%2F2ZjDt%2EdcyiLuBy%2F6mitlDNgt%2F
---------------------
HTTP/1.1 200 OK
Date: Tue, 17 Aug 2010 15:47:11 GMT
Server: Apache
X-Powered-By: PHP/5.3.2
Content-Length: 597
Keep-Alive: timeout=1, max=100
Connection: Keep-Alive
Content-Type: application/xml; charset="iso-8859-1"


---------------------
OK
200


E no mResponse o seguinte xml:

XML:
101136001SPS?o PauloBarra FundaRuado Bosque- de 1161/1162 ao fim2010-08-07 05:23:091sucesso. cep encontrado local10353550303550308


Como podemos ver na figura 2:
Figura2 - O programa em execução.


A próxima parte deste tutorial ensinará como usar a classe TXMLDocument para ler e interpretar esse XML, seguido pela parte 4 que mostrará como criar uma classe e encapsular tanto a requisição GET com o HTTPSend como a leitura do XML, fazendo com que as informações de endereço, cidade etc vão direto às propriedades da classe. Por último mostraremos, na parte 5, como podemos adaptar nosso request com HTTPSend para usar proxy.

Até lá ;)

Ir Para:


Parte 1 | Parte 2 | Parte 3 | Parte 4 | Parte 5

Nenhum comentário:

Postar um comentário

Postagens populares

Marcadores

delphi (60) C# (31) poo (21) Lazarus (19) Site aos Pedaços (15) sql (13) Reflexões (10) .Net (9) Humor (9) javascript (9) ASp.Net (8) api (8) Básico (6) Programação (6) ms sql server (5) Web (4) banco de dados (4) HTML (3) PHP (3) Python (3) design patterns (3) jQuery (3) livros (3) metaprogramação (3) Ajax (2) Debug (2) Dicas Básicas Windows (2) Pascal (2) games (2) linguagem (2) música (2) singleton (2) tecnologia (2) Anime (1) Api do Windows (1) Assembly (1) Eventos (1) Experts (1) GNU (1) Inglês (1) JSON (1) SO (1) datas (1) developers (1) dicas (1) easter egg (1) firebird (1) interfaces (1) introspecção (1) memo (1) oracle (1) reflexão (1)