我正在使用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;