27. HTTP-клиент

HTTP-клиент представлен классом THttpClient. С помощью этого класса вы можете отправлять различные запросы и данные в Интернет. Класс может работать в синхронном и асинхронном режиме и поддерживает SSL. Пример:

procedure ButtonClick(Sender: TObject);
var
  HC: THttpClient;
begin
  HC := THttpClient.Create;
  HC.Send('GET', 'http://mydataexpress.ru');
  Debug(HC.Content);
  HC.Free;
end;

Метод Send отправляет запрос серверу и получает ответ. В первом параметре указывается один из допустимых методов запроса. Чаще всего используются GET и POST. Во втором параметре указывается URL. Ответ от сервера будет в свойстве Content. Ответ может сохранятся в поток. Для этого нужно задать свойство ContentStream.

procedure ButtonClick(Sender: TObject);
var
  HC: THttpClient;
  FS: TFileStream;
begin
  FS := TFileStream.Create('index.html', fmCreate);
  HC := THttpClient.Create;
  HC.ContentStream := FS;
  HC.Send('GET', 'http://mydataexpress.ru');
  FS.Free;
  HC.Free;
end;

По умолчанию клиент работает в синхронном режиме, т. е. программа будет ждать выполнения метода Send. В асинхронном режиме общение с сервером происходит в отдельном потоке. После вызова метода Send сразу выполняется следующая строка кода.

var
  HC: THttpClient;
 
procedure DataReceived(Sender: TObject; ContentLength, CurrentPos: Int64);
begin
  Debug(Format('Скачано %d байт из %d', [CurrentPos, ContentLength]));
end;
 
procedure Finish(Sender: TObject);
begin
  Debug('Задание выполнено');
end;
 
procedure ButtonClick(Sender: TObject);
begin
  HC.Send('GET', 'http://mydataexpress.ru/files/dataexpress3b.zip');
end;
 
procedure CancelBnClick(Sender: TObject);
begin
  HC.Terminate;
end;
 
procedure Form_Create;
begin
  HC := THttpClient.Create;
  HC.Async := True;
  HC.OnDataReceived := @DataReceived;
  HC.OnFinish := @Finish;
  dxButton1.OnClick := @ButtonClick;
  CancelBn.OnClick := @CancelBnClick;
end;
 
procedure Form_Destroy;
begin
  HC.Free;
end;

Если вызвать метод Send в то время, как происходит скачивание, то выполняемая операция будет прервана и скачивание начнется заново. При уничтожении HTTP-клиента выполняемая операция будет прервана.