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.