使用Delphi和Indy通过SSL URL进行GET

时间:2018-06-16 01:12:46

标签: delphi ssl indy

我正在使用XE8。 我的openssl dll是1.0.2.13版本。

我有下一个带有文档的网站来获取一些货币兑换价值: https://api.promasters.net.br/cotacao/#documentacao

我正在尝试下一个代码,但是我收到了一个错误:

'Error connecting with SSL.'#$D#$A'error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure' 

如果我将下一行放入浏览器“http://api.promasters.net.br/cotacao/v1/valores”,则会返回正确的值。

我该如何解决?

我的代码:

const ss='http://api.promasters.net.br/cotacao/v1/valores';
    var
      s: string;
      lHTTP: TIdHTTP;
      HandlerSock:TIdSSLIOHandlerSocketOpenSSL;
    begin
      lHTTP := TIdHTTP.Create(nil);
      lHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
      try
        HandlerSock:=TIdSSLIOHandlerSocketOpenSSL.Create(lHTTP);
        HandlerSock.SSLOptions.Method := sslvSSLv23;
        HandlerSock.SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_1, sslvTLSv1];
        lHTTP.IOHandler := HandlerSock;
        lHTTP.HandleRedirects := True;
        s := lHTTP.Get(ss);
        ShowMessage(s);
      finally
        lHTTP.Free;
      end;
    end;

如果我使用下一个代码,它可以工作,但它不使用Indy。我喜欢纯粹的Indy代码。

const ss='https://api.promasters.net.br/cotacao/v1/valores';
var
  Resp, Req: TStringStream;
  recieveID: Integer;
  Rio: THTTPRIO;
  s, tv: string;
begin
  Rio := THTTPRIO.Create(Nil);
  Rio.HTTPWebNode.URL :=ss;
  Rio.HTTPWebNode.CheckContentType; 
  Rio.HTTPWebNode.Agent :='Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
  Rio.Port := '443';
  Result := '';
  Resp := TStringStream.Create('');
  Req := nil;
  try
    Req := TStringStream.Create(s, TEncoding.UTF8);
    try
      recieveID := Rio.HTTPWebNode.Send(Req); // Request
      Rio.HTTPWebNode.Receive(recieveID, Resp, false); // Response
      Resp.Position := 0;
      Result:=Resp.DataString;
    except
      on e:exception do begin
        Result := '';
      end;
    end;
  finally
    if Assigned(Req) then
      Req.Free;
    Resp.Free;
    Rio.Free;
  end;
end;

0 个答案:

没有答案