【问题标题】:Why TIdHTTP can't get a result correctly, but Postman can为什么 TIdHTTP 不能正确得到结果,但 Postman 可以
【发布时间】:2020-08-21 13:28:46
【问题描述】:

我在 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');

【问题讨论】:

  • 请包含请求失败并显示错误消息时发生的实际错误消息。否则,包括实际响应和预期响应(如果它们不同)。
  • 您是否遇到了异常?如果是这样,它说明了什么?什么是ResponseCode 报告?为什么要使用TStringStream 而不是使用返回StringGet() 版本?您确定服务器以 UTF-8 格式发送数据吗?
  • ResponseCode 是 200 ,没有出现异常,我也测试了 Unicode,ANSI,同样的结果
  • 我指的是URL(emh5.eastmoney.com/api/CaoPanBiDu/…),其他的URL都可以,该URL在浏览器中也可以,但是在idhttp组件中无效。
  • 您可以使用 TRESTRequest。我可以给你举个例子

标签: delphi https get idhttp


【解决方案1】:

我在这里看到这个网站需要 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];

【讨论】:

  • 我用的是ssleay32.dll(1.0.2.15),libeay32.dll(1.0.2.15),idhttp是10.6.2.5298,bug是但是无效
猜你喜欢
  • 2016-12-04
  • 2016-11-04
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 2016-07-03
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多