为什么TIdHTTP无法正确获得结果,但是Postman可以

问题描述

我已经在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];

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...