问题描述
我已经在Delphi XE3中编写了一个函数,可以使用TIdHTTP
从Web上获取一些数据。它无法正确获得结果,但邮递员可以。使用浏览器也可以正常返回数据。
有人可以在这里帮忙吗?
procedure CreateHTTP(var vHTTP: TIdHTTP; var vSSL: TIdSSLIOHandlerSocketopenSSL);
begin
vHTTP := TIdHTTP.Create(nil);
vSSL := TIdSSLIOHandlerSocketopenSSL.Create(vHTTP);
vSSL.SSLOptions.Method := sslvTLSv1;
vSSL.SSLOptions.Mode := sslmClient;
vHTTP.ProtocolVersion := pv1_0;
vHTTP.HandleRedirects := True;
vHTTP.IOHandler := vSSL;
vHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/76.0.3809.100 Safari/537.36';
vHTTP.Request.ContentType := 'text/plain';
end;
function HttpGetData(vUrl: String): String;
var
lIdHttp: TIdHTTP;
lSSL: TIdSSLIOHandlerSocketopenSSL;
lDataStream: TStringStream;
lCode: integer;
begin
Result :='';
CreateHTTP(lIdHttp,lSSL);
lDataStream := TStringStream.Create('',TEncoding.UTF8);
try
try
lIdHttp.Get(vUrl,lDataStream);
lCode := lIdHttp.ResponseCode;
Result := lDataStream.DataString;
except
on E: EIdHTTPProtocolException do
begin
lIdHttp.disconnect;
end;
end;
finally
lIdHttp.disconnect;
lDataStream.Free;
lSSL.Free;
lIdHttp.Free;
end;
end;
lData := HttpGetData('https://emh5.eastmoney.com/api/CaoPanBiDu/GetCaoPanBiDuPart1Get?fc=30023602&color=w');
解决方法
我在这里看到该站点需要TLS 1.2。开始时,它在这里也行不通,但后来我将Indy更新为10.6.2,将ssleay32.dll和libeay32.dll更新为新版本,并且与TLS 1.2配合良好。哦,我也在这里更改了代码
vSSL.SSLOptions.Method := sslvTLSv1_2; //sslvTLSv1;
vSSL.SSLOptions.SSLVersions := [sslvTLSv1_2];