get запрос через idhttp на https

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Farcar, 8 Jan 2012.

  1. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Отправляю гет запрос на https, подключил к idhttp компонент IdSSLIOHandlerSocket и при отправке запроса выдает такую ошибку:

    [​IMG]

    SSL библиотеку закинул в папку с проектом.

    Подскажите в чем проблема.
    Заранее спасибо.

    З.Ы. Использую Делфи 7
     
  2. C00LPack

    C00LPack Elder - Старейшина

    Joined:
    7 Oct 2010
    Messages:
    425
    Likes Received:
    72
    Reputations:
    19
    https://forum.antichat.ru/thread310569.html
     
  3. tght

    tght Member

    Joined:
    24 Jun 2010
    Messages:
    134
    Likes Received:
    10
    Reputations:
    0
    В этой теме вопрос так и не решён.
     
  4. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    Он и не будет решен... .Т.к. это глюк самой инди.
    ps Я добивался чтобы инди пахал с ssl, но сам запрос в снифере к https видно не было=) вот такая шляпа...
    Конечно можно попробовать разные варианты что-то может и получится, но это все демагоги, так что мой вам совет ищите другой вариант, например wininet, конечно не так там все просто как инди, но зато стабильно и быстрее...
    примеров тоже для делфи куча, так что дерзайте
     
  5. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    тоже сталкивался с мозгоебкой со старой Indy: ставь Indy 10, она хоть меньше глючит.
     
    #5 realcoder, 8 Jan 2012
    Last edited: 8 Jan 2012
  6. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    1) обнови инди
    2) запросы через https не видно не только с инди, их не видно и через браузер (на то оно и шифрованное соединение)
     
  7. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    тс, если уж такие проблемы с инди попробуй 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;
    
     
  8. Админ

    Админ New Member

    Joined:
    30 Dec 2011
    Messages:
    23
    Likes Received:
    3
    Reputations:
    5
    Мда, столько гемора...
    Если использовать синапс, то всё решается добавлением в uses ssl_openssl.
    И потом обычный GET
    HTTP.HTTPMethod('GET','https://site.com');
     
  9. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    с инди все решается подлючением SSL библиотеки и обьекта TidSSLOpenSocketSSL в TidHTTP.IOHandler
    P.S. явный холивар :D
     
  10. Админ

    Админ New Member

    Joined:
    30 Dec 2011
    Messages:
    23
    Likes Received:
    3
    Reputations:
    5
    В синапсе только подключением либы :D
    P.S.: Synapse рулит ;)
     
    1 person likes this.
  11. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Спасибо за синапс, все вроде выходит
     
  12. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Чтото ничего не выходит, форумчане, подскажите как лутше это реализовать
     
  13. Админ

    Админ New Member

    Joined:
    30 Dec 2011
    Messages:
    23
    Likes Received:
    3
    Reputations:
    5
    Пример своего кода в студию, тогда сможем помочь.
    Мы не телепаты ;)