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
Postar um comentário