Requisições HTTP com Delphi sem componentes 4


WinHTTP
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 é:

  1. Navegar utilizando a biblioteca WinHTTP
  2. Salvar o conteúdo em Stream
  3. Salvar o Stream em um arquivo
  4. Carregar o conteúdo de Stream no TWebBrowser

Comentários

  1. Qual nome dessa ocx?

  2. Cesar disse:

    @Gilson, é o “Microsoft WinHTTP Services”

  3. Rogério disse:

    Valeu pela dica, foi muito útil. No google foi difícil de encontrar.

  4. Evandro disse:

    Foi muito útil! Meu problema é carregar uma imagem jpg da web e gerar um TBitMap. Acho que assim vai ficar fácil.