Download via HTTP com Synapse

Synapse é uma excelente biblioteca de comunicação TCP/IP síncrona freeware e open-source para Delphi. Com ela é fácil fazer downloads de qualquer tipo de arquivo via HTTP. Vou mostrar rapidamente como baixar e gravar arquivos, obter imagens JPEG e strings. De quebra, uma função para obter seu endereço IP externo.

Synapse é puro código. Não tem componentes visuais e não precisa ser instalada. Tudo o que você precisa fazer para usar as funções abaixo é incluir a unit “httpsend” na cláusula uses e começar a usar as suas classes e rotinas (não deixe de incluir o caminho para “synapse\source” no seu “Search Path”).

A classe THTTPSend usa apenas o método HTTPMethod para fazer conexões GET e POST no protocolo HTTP. Mais simples ainda é usar as procedures HttpGetText e HttpGetBinary. HttpGetText traz o conteúdo de uma URL em formato texto através de um objeto TStrings. Você pode usar qualquer descendente, como um TStringList ou a propriedade Lines de um objeto TMemo.

function HttpGetText(const URL: string;
  const Response: TStrings): Boolean;

HttpGetBinary retorna o conteúdo binário de uma URL em um objeto TStream. Por conteúdo binário entenda qualquer tipo de arquivo: JPG, TXT, WMV, CSS, PDF, ZIP… Você pode usar qualquer tipo de objeto descendente de TStream, como TFileStream ou TMemoryStream, ou mesmo o stream de um campo TBlobField.

function HttpGetBinary(const URL: string;
  const Response: TStream): Boolean;

GetFile, GetImage e GetString

Eu tenho algumas próprias rotinas que facilitam ainda mais a vida. Nessas rotinas você pode observar exemplos de uso das funções nativas da Synapse.

A primeira é HttpGetFile, que salva um arquivo dada a sua URL:

uses httpsend;
 
function HttpGetFile(const URL: String; const FileName: String): Boolean;
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(FileName, fmCreate);
  try
    Result := HttpGetBinary(URL, Stream);
  finally
    Stream.Free;
  end;
end;

Simples, não é?

Outra legal é HttpGetImage, que retorna um objeto TPicture contendo um arquivo de imagem JPEG baixado direto da Internet

uses httpsend, jpeg;
 
function HttpGetImage(const URL: String; Graphic: TPicture): Boolean;
var
  Stream: TMemoryStream;
  Image: TJPEGImage;
begin
  Stream := TMemoryStream.Create;
  try
    if HttpGetBinary(URL, Stream) then
    begin
      Image := TJPEGImage.Create;
      try
        Stream.Seek(0, soFromBeginning);
        Image.LoadFromStream(Stream);
        Graphic.Assign(Image);
      finally
        Image.Free;
      end;
    end;
  finally
    Stream.Free;
  end;
end;

Experimente usar direto em um componente visual TImage:

HttpGetImage(URL, Image1.Picture);

Quando você quiser ler uma página como uma String, use HttpGetString:

uses httpsend;
 
function HttpGetString(const URL: String): String;
var
  Strings: TStringList;
begin
  Strings := TStringList.Create;
  try
    if HttpGetText(URL, Strings) then
      Result := Strings.Text
    else
      Result := '';
  finally
    Strings.Free;
  end;
end;

Uma aplicação interessante dessa última rotina é pegar o seu endereço IP externo (fora da rede local, com seu NAT) através do serviço CheckIP da DynDNS.com. Tudo que eu faço é pegar o output HTML da página e deixar apenas o valor do IP.

function ExternalIP: String;
var
  Response: String;
  Start, Finish: Integer;
begin
  Response := HttpGetString('http://checkip.dyndns.com/');
  Start := Pos(': ', Response) + 2;
  Finish := Pos('</body>', Response);
  Result := Copy(Response, Start, Finish - Start);
end;

Comments

Deixe uma Resposta




XHTML: Você pode usar essas tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="">