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-клиента выполняемая операция будет прервана.