Отправляю гет запрос на https, подключил к idhttp компонент IdSSLIOHandlerSocket и при отправке запроса выдает такую ошибку: SSL библиотеку закинул в папку с проектом. Подскажите в чем проблема. Заранее спасибо. З.Ы. Использую Делфи 7
Он и не будет решен... .Т.к. это глюк самой инди. ps Я добивался чтобы инди пахал с ssl, но сам запрос в снифере к https видно не было=) вот такая шляпа... Конечно можно попробовать разные варианты что-то может и получится, но это все демагоги, так что мой вам совет ищите другой вариант, например wininet, конечно не так там все просто как инди, но зато стабильно и быстрее... примеров тоже для делфи куча, так что дерзайте
1) обнови инди 2) запросы через https не видно не только с инди, их не видно и через браузер (на то оно и шифрованное соединение)
тс, если уж такие проблемы с инди попробуй winnet обертка, что ниже не самая лучшая, но простая и работает без особых единственное что в ней Header под "свои" нужды подправить Code: unit wnet; interface uses Windows, SysUtils, Variants, Classes, WinInet; type EWinInetException = class(Exception); TWinInet = class private FSession: HINTERNET; FConnect: HINTERNET; FClient: String; FHost: String; FPort: Word; FUser: String; FPassword: String; FService: Word; FConnected: Boolean; FHttps: Boolean; FDwFlags: DWORD; public constructor Create(Host: String); destructor Destroy; override; function Connect: Boolean; function SendGET(const Url: String): String; function SendPOST(const Url, Post: String): String; published property Port: Word read FPort write FPort default INTERNET_DEFAULT_HTTP_PORT; property Client: String read FClient write FClient; property User: String read FUser write FUser; property Password: String read FPassword write FPassword; property Service: Word read FService write FService default INTERNET_SERVICE_HTTP; property HTTPS: Boolean read FHttps write FHttps; property dwFlags: DWORD read FDwFlags write FDwFlags default INTERNET_FLAG_KEEP_CONNECTION; end; implementation constructor TWinInet.Create(Host: String); begin FDwFlags:= 0; FHost:= Host; end; destructor TWinInet.Destroy; begin if (FSession <> nil) then InternetCloseHandle(FSession); if (FConnect <> nil) then InternetCloseHandle(FConnect); end; function TWinInet.Connect: Boolean; begin FSession:= InternetOpen(PChar(FClient), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); if (FSession = nil) then raise EWinInetException.Create('Failed call InternetOpen'); FConnect:= InternetConnect(FSession, PChar(FHost), FPort, PChar(FUser), PChar(FPassword), FService, 0, 0); if (FConnect = nil) then raise EWinInetException.Create('Failed call InternetConnect'); Result:= True; FConnected:= Result; end; function GetTextHtml(hReq: HINTERNET): String; var dwBytesAvailable, dwBytesRead: DWORD; lpBuff: Pointer; S: String; begin dwBytesAvailable:= 0; Result:= ''; if InternetQueryDataAvailable(hReq, dwBytesAvailable, 0, 0) then begin GetMem(lpBuff, dwBytesAvailable); if (lpBuff <> nil) then try repeat if not InternetReadFile(hReq, lpBuff, dwBytesAvailable, dwBytesRead) then Break; SetString(S, PChar(lpBuff), dwBytesRead); Result:= Result + S; until dwBytesRead = 0; finally FreeMem(lpBuff); end; end; end; const CL = #13#10; CL2 = CL + CL; function TWinInet.SendGET(const Url: String): String; var hReq: HINTERNET; Header: String; begin if FConnected then begin if HTTPS then FDwFlags:= FDwFlags or INTERNET_FLAG_SECURE or INTERNET_FLAG_IGNORE_CERT_CN_INVALID or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID or INTERNET_FLAG_KEEP_CONNECTION; hReq:= HttpOpenRequest(FConnect, 'GET', PChar(Url),nil, nil, nil, FDwFlags, 0); if (hReq <> nil) then try Header:= 'Accept: text/html, */*' + CL + 'Host: ' + FHost + CL + 'User-Agent: ' + FClient + CL + 'Keep-Alive: 115' + CL + 'Connection: keep-alive'; if HttpSendRequest(hReq, PChar(Header), Length(Header), nil, 0) then begin Result:= GetTextHtml(hReq); end; finally InternetCloseHandle(hReq); end; end; end; function TWinInet.SendPOST(const Url, Post: String): String; var hReq: HINTERNET; Header: String; begin if FConnected then begin if HTTPS then FDwFlags:= FDwFlags or INTERNET_FLAG_SECURE or INTERNET_FLAG_IGNORE_CERT_CN_INVALID or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID or INTERNET_FLAG_KEEP_CONNECTION; hReq:= HttpOpenRequest(FConnect, 'POST', PChar(Url),nil, nil, nil, FDwFlags, 0); if (hReq <> nil) then try Header:= 'Accept: text/html, */*' + CL + 'Host: ' + FHost + CL + 'User-Agent: ' + FClient + CL + 'Keep-Alive: 115' + CL + 'Connection: keep-alive' + CL + 'Content-Length: ' + IntToStr(Length(Post)) + CL + 'Content-Type: application/x-www-form-urlencoded'; if HttpSendRequest(hReq, PChar(Header), Length(Header), PChar(Post), Length(Post)) then begin Result:= GetTextHtml(hReq); end; finally InternetCloseHandle(hReq); end; end; end; end. ну и юзается так: Code: uses wnet, WinInet; ................... procedure TFMain.bmGetSMSClick(Sender: TObject); var net: TWinInet; tmp: String; begin // настройка подключения net:= TWinInet.Create('icq.com'); try net.HTTPS:= True; // если True, то используется HTTPS иначе HTTP net.Port:= INTERNET_DEFAULT_HTTPS_PORT; // Для HTTPS INTERNET_DEFAULT_HTTPS_PORT = (443), HTTP INTERNET_DEFAULT_HTTP_PORT = (80) net.Service:= INTERNET_SERVICE_HTTP; net.Client:= 'ICQ_Android'; // имя веб клиента if net.Connect then begin // пост запрос на "https://icq.com/smsreg/normalizePhoneNumber.php" tmp:= net.SendPOST('/smsreg/normalizePhoneNumber.php', 'locale=ru&smsFormatType=SMS&f=json'); ShowMessage(tmp); // гет запрос "https://icq.com/xtraz/srv/gt/gt.php?details=all" tmp:= net.SendGET('/xtraz/srv/gt/gt.php?details=all'); ShowMessage(tmp); end; finally net.Free; end; end;
Мда, столько гемора... Если использовать синапс, то всё решается добавлением в uses ssl_openssl. И потом обычный GET HTTP.HTTPMethod('GET','https://site.com');
с инди все решается подлючением SSL библиотеки и обьекта TidSSLOpenSocketSSL в TidHTTP.IOHandler P.S. явный холивар