Busca de CEP com o Lazarus - Parte 4 - Testando e Usando o TLazCep

Antes de começar a fazer as alterações e melhorias prometidas na parte 3, vamos mostrar como deve ser o uso da biblioteca TLazCep. Adicione um botão e dois memos a form que estivemos usando até agora.

Lembrando: essa form já tem 3 edits (edCep, edChave e edUrl) e agora ficará com 4 memos (mRequest, mResponse, mXML e mEndereco)

Os memos mRequest e mResponse são de nossos exemplos anteriores e não serão usados por enquanto. Só quando falarmos de proxy.

Deixe o formulário como a imagem abaixo,


O LFM do formulário ficará assim:

object Form1: TForm1
  Left = 252
  Height = 314
  Top = 281
  Width = 718
  Caption = 'Form1'
  ClientHeight = 314
  ClientWidth = 718
  LCLVersion = '0.9.28.2'
  object Label1: TLabel
    Left = 8
    Height = 14
    Top = 0
    Width = 20
    Caption = 'CEP'
    ParentColor = False
  end
  object Label2: TLabel
    Left = 96
    Height = 14
    Top = 0
    Width = 32
    Caption = 'Chave'
    ParentColor = False
  end
  object Label3: TLabel
    Left = 280
    Height = 14
    Top = 0
    Width = 20
    Caption = 'URL'
    ParentColor = False
  end
  object mResquest: TMemo
    Left = 8
    Height = 226
    Top = 80
    Width = 176
    Lines.Strings = (
      '"Conversas" HTTP:'
      '============'
    )
    TabOrder = 0
  end
  object mResponse: TMemo
    Left = 192
    Height = 226
    Top = 80
    Width = 168
    Lines.Strings = (
      'Respostas:'
      '============='
    )
    TabOrder = 1
  end
  object edCep: TEdit
    Left = 8
    Height = 21
    Top = 16
    Width = 80
    TabOrder = 2
    Text = '01136-001'
  end
  object btTestarTlazCep: TButton
    Left = 368
    Height = 25
    Top = 48
    Width = 120
    Caption = 'Testar Classe TLazCep'
    OnClick = btTestarTlazCepClick
    TabOrder = 3
  end
  object btTeste: TButton
    Left = 112
    Height = 25
    Top = 48
    Width = 136
    Caption = 'Testar HttpSend Direto'
    OnClick = btTesteClick
    TabOrder = 4
  end
  object btTestaUrlEncode: TButton
    Left = 8
    Height = 25
    Top = 48
    Width = 96
    Caption = 'Testa UrlEncode'
    OnClick = btTestaUrlEncodeClick
    TabOrder = 5
  end
  object edUrl: TEdit
    Left = 280
    Height = 21
    Top = 16
    Width = 272
    TabOrder = 6
  end
  object edChave: TEdit
    Left = 96
    Height = 21
    Top = 16
    Width = 179
    TabOrder = 7
    Text = '1Z3s3/2ZjDt.dcyiLuBy/6mitlDNgt/'
  end
  object mXml: TMemo
    Left = 368
    Height = 226
    Top = 80
    Width = 168
    Lines.Strings = (
      'XML:'
      '============'
    )
    TabOrder = 8
  end
  object mEndereco: TMemo
    Left = 544
    Height = 226
    Top = 80
    Width = 168
    Lines.Strings = (
      'Endereço:'
      '============'
    )
    TabOrder = 9
  end
end

e no evento onClick do botão "Testar Classe LazCep" coloque o código:

procedure TForm1.btTestarTlazCepClick(Sender: TObject);
begin
     with TLazCep.Create do
     try
          Cep:=edCep.Text;
          Consultar; //ou ConsultarString;
          mXml.Lines.Append(GetXML);
          mEndereco.Lines.Append(Logradouro);
          mEndereco.Lines.Append(Bairro);
          mEndereco.Lines.Append(Cidade);
          mEndereco.Lines.Append(Estado);
          mEndereco.Lines.Append(IBGECidade);
          mEndereco.Lines.Append(IBGEEstado);
          mEndereco.Lines.Append(IBGEVerificador);
     finally
            Free;
     end;   
end;  

Colocando para rodar você perceberá um problema: Não aparecem os acentos corretamente.

do Bosque
Barra Funda
S?o Paulo
SP
355030
35
3550308

Coisa parecida pode ter acontecido com a própria exibição do XML.




Isso é porque o que chega do XML são WideStrings de 16 bits (lembra das DomStrings?) e os edits não suportam esse tipo de formato. Ocorrem perdas de dados ao se converter as widestrings para strings comuns. A grande vantagem é que a LCL (conjunto de componentes visuais do lazarus, como a VCL do Delphi: edits, memos etc) suporta strings em formato utf-8. Então podemos usar a função AnsiToUtf8. Isso corrigirá o problema dos acentos.


Endereço:
============
do Bosque
Barra Funda
São Paulo
SP
355030
35
3550308

Já falando sobre proxy, teremos que criar uma função que use o GET, mas passando para a classe HTTPSend o proxy.


Vimos como trazer o conteudo de uma página web com as funções HttpGetBinary e HttpGetText, porém elas não funcionam com proxy, mas vamos dar uma olhada de perto na HttpGetBinary:

function HttpGetBinary(const URL: string; const Response: TStream): Boolean;
var
  HTTP: THTTPSend;
begin
  HTTP := THTTPSend.Create;
  try
    Result := HTTP.HTTPMethod('GET', URL);
    if Result then
    begin
      Response.Seek(0, soFromBeginning);
      Response.CopyFrom(HTTP.Document, 0);
    end;
  finally
    HTTP.Free;
  end;
end; 

E vamos adicionar as linhas, logo acima, entrando no try:
HTTP.ProxyHost := [[Seu servidor de proxy]];
    HTTP.ProxyPort := [[porta]];
    HTTP.ProxyUser := [[login]];
    HTTP.ProxyPass := [[senha]]; 

Você pode mudar o nome da função, para ProxyHttpGetBinary, ou pode, mais corretamente, manter o mesmo nome e extender sua assinatura, aumentando o número de parâmetros. (overload). Isso é polimorfismo. Você não precisa fazer isso na propria unit HTTPSend, mas pode fazer em uma unit sua dedicada a isso (http) ou na propria unit do TLazCep, que foi o que fizemos.


As novas funções ficarão assim:


function HttpGetBinary(const URL: string; const Response: TStream;
         ProxyHost, ProxyPort, ProxyUser, ProxyPass: string): Boolean;
var
  HTTP: THTTPSend;
begin
  HTTP := THTTPSend.Create;
  try
    HTTP.ProxyHost := ProxyHost;
    HTTP.ProxyPort := ProxyPort;
    HTTP.ProxyUser := ProxyUser;
    HTTP.ProxyPass := ProxyPass;
    Result := HTTP.HTTPMethod('GET', URL);
    if Result then
    begin
      Response.Seek(0, soFromBeginning);
      Response.CopyFrom(HTTP.Document, 0);
    end;
  finally
    HTTP.Free;
  end;
end;

function HttpGetText(const URL: string; const Response: TStrings;
         ProxyHost, ProxyPort, ProxyUser, ProxyPass: string): Boolean;
var
  HTTP: THTTPSend;
begin
  HTTP := THTTPSend.Create;
  try
    HTTP.ProxyHost := ProxyHost;
    HTTP.ProxyPort := ProxyPort;
    HTTP.ProxyUser := ProxyUser;
    HTTP.ProxyPass := ProxyPass;
    Result := HTTP.HTTPMethod('GET', URL);
    if Result then
      Response.LoadFromStream(HTTP.Document);
  finally
    HTTP.Free;
  end;
end;  


Legal, agora para onde (ou por onde) repassaremos essas informações de proxy? Teremos que alterar a classe TLazCep, colocando essas quatro propriedades (ProxyHost, ProxyPort, ProxyUser e ProxyPass).

Veremos isso na próxima parte desse tutorial, mostrando como podemos embutir o proxy e a conversão para UTF-8 dentro da propria classe TLazCep, como podemos melhorar certas funções, como a urlEncode e mais.


Podemos ainda expandir bastante este artigo. Alguma sugestão?


Have Fun ;)





Ir Para:


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

Comentários

Postagens mais visitadas deste blog

Detectar o encoding de um arquivo para não corromper ao transformá-lo

erro "ora-12154: tns: não foi possível resolver o identificador de conexão especificado"

Quebras de linha no Delphi 2010