TIdHTTP odbiór danych od servera delphi
TIdHTTP
(ew. dynamicznie). TIdSSLIOHandlerSocketOpenSSL
i ustawić wersję TLS. Get
, Post
lub inną metodę HTTP – tekst odbieramy jako string
, pliki/duże dane do TStream
. EIdHTTPProtocolException
, EIdSocketError
). Kluczowe punkty
• Blokujący charakter Indy → używaj wątków/TTask
.
• SSL wymaga bibliotek OpenSSL w folderze EXE.
• Zarządzaj timeoutami: ConnectTimeout
, ReadTimeout
.
• Zawsze zwalniaj obiekty w finally
.
uses IdHTTP, SysUtils;
function GetText(const Url: string): string;
var
Http: TIdHTTP;
begin
Http := TIdHTTP.Create(nil);
try
Http.ConnectTimeout := 5000; // ms
Http.ReadTimeout := 10000;
Result := Http.Get(Url); // blokujące
finally
Http.Free;
end;
end;
uses IdHTTP, IdSSLOpenSSL;
function GetSecureText(const Url: string): string;
var
Http: TIdHTTP;
SSL : TIdSSLIOHandlerSocketOpenSSL;
begin
Http := TIdHTTP.Create(nil);
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(Http); // właścicielem staje się Http
try
SSL.SSLOptions.Method := sslvTLSv1_2;
SSL.SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_3]; // jeśli kompilacja OpenSSL obsługuje 1.3
Http.IOHandler := SSL;
Result := Http.Get(Url);
finally
Http.Free; // zwolni także SSL
end;
end;
procedure DownloadFile(const Url, FileName: string);
var
Http : TIdHTTP;
Fs : TFileStream;
begin
Http := TIdHTTP.Create(nil);
Fs := TFileStream.Create(FileName, fmCreate);
try
Http.Get(Url, Fs); // zapis bezpośrednio do pliku
finally
Fs.Free;
Http.Free;
end;
end;
TTask.Run(
procedure
var S: string;
begin
try
S := GetText('https://api.ipify.org?format=json');
TThread.Queue(nil,
procedure
begin
Memo1.Text := S; // aktualizacja UI w głównym wątku
end);
except
on E: Exception do
TThread.Queue(nil,
procedure
begin
ShowMessage('Błąd: ' + E.Message);
end);
end;
end);
• Nagłówki:
Http.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + Token;
• Ciasteczka: IdHTTP.CookieManager := IdCookieManager1;
• Kompresja: Http.Compressor := TIdCompressorZLib.Create(Http);
• Proxy:
Http.ProxyParams.ProxyServer := 'proxy.local';
Http.ProxyParams.ProxyPort := 8080;
• Przekierowania: Http.HandleRedirects := True; Http.RedirectMaximum := 5;
try
S := Http.Get(Url);
except
on E: EIdHTTPProtocolException do
LogFmt('HTTP %d %s, body=%s', [E.ErrorCode, Http.ResponseText, E.ErrorMessage]);
on E: EIdSocketError do
Log('Błąd gniazda: ' + E.Message);
end;
TIdHTTP
konwertuje odebrane bajty do Unicode na podstawie nagłówka Content-Type
; jeśli serwer nie zwraca charsetu – można wymusić: Http.Response.ContentType := 'application/json; charset=utf-8';
libssl-1_1.dll
, libcrypto-1_1.dll
; od Indy 10.7 można użyć 3.x po podmianie pliku IdOpenSSLSetLibPath
. VerifyMode := []
) łamie podstawowe zasady bezpieczeństwa – rób to wyłącznie w środowisku testowym. TIdHTTP
na wątek zamiast tworzyć ją na każde żądanie (oszczędność gniazd). ConnectTimeout
oraz ReadTimeout
adekwatnie do jakości sieci, a w logice aplikacji przewiduj powtarzanie żądań („retry with exponential back-off”). Range
/ResumeSupported
i obsługę postępu (OnWork
, OnWorkBegin
, OnWorkEnd
). System.Net.HttpClient
korzysta z natywnych stosów i bywa lżejszy niż Indy. RESTRequest4Delphi
– nakładkę upraszczającą wywołania REST z Indy. System.Net.URLClient.THTTPClient
pod kątem HTTP/2 oraz obsługi certyfikatów typu PFX. TIdHTTP pozostaje solidnym klientem HTTP w Delphi. Umożliwia łatwe pobieranie danych tekstowych i binarnych, wymaga jednak:
• podpięcia OpenSSL dla HTTPS,
• ręcznego wątkowania w celu zachowania responsywności GUI,
• starannej obsługi wyjątków oraz kodów statusu.
Dla nowych projektów warto rozważyć System.Net.HttpClient
lub biblioteki wspierające HTTP/2, lecz Indie zapewnia największą kompatybilność wsteczną. Dzięki powyższym wskazówkom zbudujesz bezpieczny, stabilny mechanizm odbioru danych od serwera w Delphi.