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. Barra Funda
S?o Paulo
SP
355030
35
3550308
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
============
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
Nenhum comentário:
Postar um comentário