HTTP Client API — это фреймворк, появившейся впервые в Delphi XE8 и, получивший развитие в более поздних версиях Delphi. На момент 2019 года HTTP Client API позволяет работать с сокетами как в синхронном, так и асинхронном режимах. HTTP Client API позволяет вашим приложениям Delphi отправлять запросы к серверам по протоколу HTTP и работать с ответами.
Этот пример не использует компоненты Delphi, однако использует один из базовых классов — THTTPClient для скачивания файла из Сети в асинхронном режиме.
Основная информация по компоненту | ||
Исходник официального примера и документация | 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.
При этом, в качестве параметров метода мы указываем:
- Обработчик события, , который вызывается при получении ответа или сбое запроса (DoEndDownload)
- URL запроса
- Поток для сохранения файла.
Обработчик 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, который гарантирует, что указанный ответ выполнен успешно или создает исключение, если ответ не выполнен.
Вид работающего демонстрационного приложения показан на рисунке ниже:
При подготовке статьи использовалась информация со следующих ресурсов:
- Официальный репозиторий демонстрационных примеров Delphi на SourceForge
- Информация по работе с классом THTTPClient на сайте Embarcadero