Requisições HTTP com Delphi sem componentes

Para efetuar requisições HTTP sem nenhum componente, é necessário utilizar as bibliotecas do Windows. Em todas as versões recentes do Windows a biblioteca WinHTTP está disponível também através da interface COM, e o Delphi faz nossa vida muito fácil, já que podemos importar esta biblioteca e ter os componentes instalados utilizando o Wizard de importação de Componentes, em poucos cliques.
Para gerar a unit com a interface para acessar a biblioteca WinHTTP, através do menu “Component | Import Component” – Import a Type Library >> Selecione “Microsoft WinHTTP Services” >> Você pode instalar os componentes no Delphi ou apenas gerar a unit e adicionar ao seu projeto, eu utilizei esta opção e o Wizard criou e adicionou ao meu projeto uma nova unit chamada WinHttp_TLB.pas.
Eu escrevi os métodos HttpRequest e SaveHttpResponse, para reutilizar em meus projetos, a seguir o código completo destes métodos e como utilizá-los.
uses
ActiveX, AxCtrls, WinHttp_TLB;
function HttpRequest(const URL: string): IStream;
var
HttpRequest: IWinHttpRequest;
begin
HttpRequest:= CoWinHttpRequest.Create;
HttpRequest.Open('GET', URL, false);
HttpRequest.Send(EmptyParam);
Result:= IUnknown(HttpRequest.ResponseStream) as IStream;
HttpRequest:= nil;
end;
procedure SaveHttpResponse(const ResponseStream: IStream; const FileName: string);
var
OleStream: TOleStream;
FileStream: TFileStream;
begin
if (ResponseStream = nil) or (FileName = '') then
Exit;
OleStream:= TOleStream.Create(ResponseStream);
try
FileStream:= TFileStream.Create(FileName, fmCreate);
try
OleStream.Position:= 0;
FileStream.CopyFrom(OleStream, OleStream.Size);
finally
FileStream.Free;
end;
finally
OleStream.Free;
end;
end;
procedure LoadResponseFromStream(WebBrowser: TWebBrowser; const ResponseStream: IStream);
var
PersistStream: IPersistStreamInit;
begin
if not Assigned(WebBrowser.Document) then
WebBrowser.Navigate('about:blank');
if WebBrowser.Document.QueryInterface(IPersistStreamInit, PersistStream) = S_OK then
if PersistStream.InitNew = S_OK then
PersistStream.Load(ResponseStream);
end;
procedure TFormHTTPRequest.ButtonGetLoadClick(Sender: TObject);
var
ResponseStream: IStream;
begin
ResponseStream:= HttpRequest(EditURL.Text);
if ResponseStream <> nil then
begin
SaveHttpResponse(ResponseStream, EditSave.Text);
LoadResponseFromStream(WebBrowser, ResponseStream);
end;
end;
Apenas para navegar em um site utilizando o TWebBrowser, bastaria uma linha de código WebBrowser.Navigate(‘http://www.cesarromero.com.br’), mas o objetivo deste exemplo é:
- Navegar utilizando a biblioteca WinHTTP
- Salvar o conteúdo em Stream
- Salvar o Stream em um arquivo
- Carregar o conteúdo de Stream no TWebBrowser

3 Comments
Qual nome dessa ocx?
@Gilson, é o “Microsoft WinHTTP Services”
Valeu pela dica, foi muito útil. No google foi difícil de encontrar.