В дополнение ко всему, я себе как-то давно написал юнит, в котором представил 2 функции - для get и post запросов
Код:
unit _SendRequest;
interface
uses
IdURI,
Classes,
IdCookieManager, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL,
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
System.SysUtils,
WinInet;
function SendPostRequest(URL: String; Params: TStringList; cookie_dir: String; domain: String): String;
function StreamRequest(URL: String; Stream: TStream): Boolean;
function SendGetRequest(URL: String; cookie_dir: String): String;
procedure IdCookieManagerSaveFile(IdCookieManager: TIdCookieManager; dir: string);
function IdCookieManagerLoadFile(IdCookieManager: TIdCookieManager; domain, dir: string): TIdCookieManager;
implementation
uses
Main;
function SendPostRequest(URL: String; Params: TStringList; cookie_dir: String; domain: String): String;
var
IdHTTP: TIdHTTP;
IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
IdCookieManager: TIdCookieManager;
urlRequest: String;
begin
urlRequest := URL;
try
IdHTTP := TIdHTTP.Create;
except
on E: Exception do begin
Result := 'ERRORMESSAGE: ' + E.Message
end;
end;
IdHTTP.ConnectTimeout := 5000;
try
IdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36';
IdHTTP.Request.AcceptLanguage := 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3';
IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create;
IdCookieManager := TIdCookieManager.Create;
IdHTTP.CookieManager := IdCookieManager;
IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;
try
Result := Trim(IdHTTP.Post(urlRequest, Params));
except
on E: Exception do begin
Result := 'ERRORMESSAGE: ' + E.Message;
IdHTTP.Free;
end;
end;
//Result := urlRequest;
finally
IdHTTP.Free;
IdSSLIOHandlerSocketOpenSSL.Free;
IdCookieManager.Free;
end;
end;
function StreamRequest(URL: String; Stream: TStream): Boolean;
var
IdHTTP: TIdHTTP;
IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
IdCookieManager: TIdCookieManager;
urlRequest: String;
begin
urlRequest := URL;
try
IdHTTP := TIdHTTP.Create;
except
on E: Exception do begin
Result := False;
end;
end;
IdHTTP.ConnectTimeout := 5000;
try
IdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36';
IdHTTP.Request.AcceptLanguage := 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7';
IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create;
IdCookieManager := TIdCookieManager.Create;
IdHTTP.CookieManager := IdCookieManager;
IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;
try
//ShowMessage(URL);
IdHTTP.Get(urlRequest, Stream);
Result := True;
except
on E: Exception do begin
Result := False;
IdHTTP.Free;
end;
end;
//Result := urlRequest;
finally
IdHTTP.Free;
IdSSLIOHandlerSocketOpenSSL.Free;
IdCookieManager.Free;
end;
end;
function SendGetRequest(URL: String; cookie_dir: String): String;
var
IdHTTP: TIdHTTP;
IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
IdCookieManager: TIdCookieManager;
urlRequest: String;
begin
urlRequest := URL;
try
IdHTTP := TIdHTTP.Create;
except
on E: Exception do begin
Result := 'ERRORMESSAGE: Cant init IdHTTP';
end;
end;
IdHTTP.ConnectTimeout := 5000;
try
IdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36';
IdHTTP.Request.AcceptLanguage := 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3';
IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
IdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
IdCookieManager := TIdCookieManager.Create;
IdHTTP.CookieManager := IdCookieManager;
IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;
try
//ShowMessage(URL);
Result := IdHTTP.Get(urlRequest);
IdCookieManagerSaveFile(IdCookieManager, cookie_dir);
//Result := True;
except
on E: Exception do begin
Result := 'ERRORMESSAGE: ' + E.Message;
IdHTTP.Free;
end;
end;
//Result := urlRequest;
finally
IdHTTP.Free;
IdSSLIOHandlerSocketOpenSSL.Free;
IdCookieManager.Free;
end;
end;
end.
Типа, чтобы через 1 вызов облегчить обращение к собираемым данным. Я не знаю, правильный ли это подход или нет - нужен Ваш совет.
К тому же, как я понял, мне требуется авторизация на основе одних и тех же кук, но я так понимаю, при idhttp.free куки сбрасываются, и при новом соединении генерируются по новой (например, тот же PHPSESSID). Как правильно поступать в таких случаях?