уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

HTTP Client API — это фреймворк, появившейся впервые в Delphi XE8 и, получивший развитие в более поздних версиях Delphi. На момент 2019 года HTTP Client API позволяет работать с сокетами как в синхронном, так и асинхронном режимах. HTTP Client API позволяет вашим приложениям Delphi отправлять запросы к серверам по протоколу HTTP и работать с ответами.

Этот пример не использует компоненты Delphi, однако использует один из базовых классов — THTTPClient для скачивания файла из Сети в асинхронном режиме.

Основная информация по компоненту
Исходник официального примера и документация SourceForge DocWiki

Это приложение использует HTTP Client API для загрузки файла в асинхронном режиме.

Приложение использует следующие элементы управления:

  • EditFileName: позволяет указать имя файла.
  • EditURL: позволяет указать URL-адрес файла.
  • BStartDownload: запускает обработчик события BStartDownloadClick.
  • LabelGlobalSpeed: отображает среднюю скорость загрузки.
  • ImageList1: содержит изображение кнопки «Стоп».
  • BStopDownload: запускает обработчик события ButtonCancelClick.
  • ProgressBarDownload: отображает ход загрузки.
  • Memo1: отображает сообщения из приложения для пользователя.

Внешний вид демонстрационного приложения представлен на рисунке ниже:

 

Демонстрационный пример

Клик по кнопке «Start Download» запускает процесс загрузки файла в асинхронном режиме:

procedure TFormDownloadDemo.BStartDownloadClick(Sender: TObject);
begin
  BStartDownload.Enabled := False;
  SampleDownload;
end;

Процедура SampleDownload выглядит следующим образом:

procedure TFormDownloadDemo.SampleDownload;
var
  URL: string;
  LResponse: IHTTPResponse;
  LFileName: string;
  LSize: Int64;
begin
  LFileName := TPath.Combine(TPath.GetDocumentsPath, EditFileName.Text);
  try
    URL := EditURL.Text;
 
    LResponse := FClient.Head(URL);
    LSize := LResponse.ContentLength;
    Memo1.Lines.Add(Format('Head response: %d - %s', [LResponse.StatusCode, LResponse.StatusText]));
    LResponse := nil;
 
    ProgressBarDownload.Max := LSize;
    ProgressBarDownload.Min := 0;
    ProgressBarDownload.Value := 0;
    LabelGlobalSpeed.Text := 'Global speed: 0 KB/s';
 
    Memo1.Lines.Add(Format('Downloading: "%s" (%d Bytes) into "%s"' , [EditFileName.Text, LSize, LFileName]));
 
    // создаем поток, в который будем сохранять файл
    FDownloadStream := TFileStream.Create(LFileName, fmCreate);
    FDownloadStream.Position := 0;
 
    FGlobalStart := TThread.GetTickCount;
 
    // запускаем процесс загрузки в асинхронном режиме
    FAsyncResult := FClient.BeginGet(DoEndDownload, URL, FDownloadStream);
 
  finally
    BStopDownload.Enabled := FAsyncResult <> nil;
    BStartDownload.Enabled := FAsyncResult = nil;
  end;
end;

Как можно видеть из представленного выше кода Delphi, запуск асинхронного процесса загрузки файла происходит при вызове метода THTTPClient.BeginGet.

При этом, в качестве параметров метода мы указываем:

  1. Обработчик события, , который вызывается при получении ответа или сбое запроса (DoEndDownload)
  2. URL запроса
  3. Поток для сохранения файла.

Обработчик DoEndDownload выглядит следующим образом:

procedure TFormDownloadDemo.DoEndDownload(const AsyncResult: IAsyncResult);
var
  LAsyncResponse: IHTTPResponse;
begin
  try
    LAsyncResponse := THTTPClient.EndAsyncHTTP(AsyncResult);
    TThread.Synchronize(nil,
      procedure
      begin
        Memo1.Lines.Add('Download Finished!');
        Memo1.Lines.Add(Format('Status: %d - %s', [LAsyncResponse.StatusCode, LAsyncResponse.StatusText]));
      end);
  finally
    LAsyncResponse := nil;
    FreeandNil(FDownloadStream);
    BStopDownload.Enabled := False;
    BStartDownload.Enabled := True;
  end;
end;

То есть здесь мы выводим в лог сообщение пользователю о статусе операции, а также, в обязательном порядке выполняем метод THTTPClient.EndAsyncHTTP, который гарантирует, что указанный ответ выполнен успешно или создает исключение, если ответ не выполнен.

Вид работающего демонстрационного приложения показан на рисунке ниже:

При подготовке статьи использовалась информация со следующих ресурсов:

  1. Официальный репозиторий демонстрационных примеров Delphi на SourceForge
  2. Информация по работе с классом THTTPClient на сайте Embarcadero

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.