delphi TIdHTTP.Get超时,而对Postman执行的相同调用成功:可能的原因?

fquxozlt  于 2022-11-04  发布在  Postman
关注(0)|答案(1)|浏览(398)

我用 Delphi 应用程序调用WebAPI,在一些PC中,调用超时,而在其他PC中,它工作正常。
使用Postman完成的请求工作正常。
这是一个简单的自定义ping Web服务(URL在下面的代码中是Edit1.Text),实际上答案是一个文本“Pong”。
下面是调用的 Delphi 代码:

errormsg := '';
  {
  old way of setting custom headers
   IdHTTP1.Request.CustomHeaders.AddValue('X-HTTP-Method-Override', 'ForwardCommand');
  IdHTTP1.Request.CustomHeaders.AddValue('Connection', 'keep-alive');
  IdHTTP1.Request.CustomHeaders.AddValue('Accept', '*/*');
  IdHTTP1.Request.CustomHeaders.AddValue('User-Agent', 'QualibusSilent');
  IdHTTP1.Request.CustomHeaders.AddValue('Content-Type', 'text/plain');
   }
   //better way of setting custom headers
  IdHTTP1.Request.MethodOverride := 'ForwardCommand';
  IdHTTP1.Request.Connection := 'keep-alive';
  IdHTTP1.Request.UserAgent   := 'myCustomUserAgent';
  IdHTTP1.Request.ContentType   := 'text/plain';
  IdHTTP1.Request.Accept   := '*/*';
      IdSSLIOHandlerSocketOpenSSL1 :=  TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1);
      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode       := sslmClient;
      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions:= 
        [sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2];

  startTime := GetTickCount;
  Try
  sHTML := IdHTTP1.Get(Edit1.Text);
  Except
    On E:Exception do
      errormsg := e.Message;
  End;
  EndTime := GetTickCount;
  ShowMessage('Time taken: ' +
    IntToStr(endTime-startTime)+#13#10+'Error:'+errormsg);

基本上,这是一个调用,其中我使用X-HTTP-Method-Override调用一个自定义方法(ForwardCommand),而不是GET
在上面的代码中,我尝试添加许多头,以便调用真正像 Postman 一样。
如果调用是直接对IP地址进行的,它会工作,但如果我调用https URL,它会超时,代理服务器中没有错误的证据。
检查Web服务器端的日志,似乎根本没有执行调用。
这只发生在一些Windows 10机器上,而在大多数机器上,调用都能正确执行。
你能告诉我错误的原因是什么吗?我应该在 Delphi 代码中做些什么来避免超时,这样Delphi就像 Postman 一样工作了?

  • 谢谢-谢谢
rjee0c15

rjee0c151#

如 评论 中 所 述 :
为什么 当 Tidhttp 使用 proxyParams 时 不会 发生 超时 而 调用 成功 ?
...
我 终于 明白 了 邮递 员 对 印地 行为 的 原因 :代理 服务 器 。 通过 将 代理 服务 器 的 IP 和 端口 传递 给 TIdHTTP , Postman 可以 自动 检索 系统 代理 服务 器 , 因此 它 可以 正常 工作 。
Windows 上 没有 " 系统 代理 " , 但 WinInet API 中 有 一 个 代理 , 这 是 Internet Explorer ( 和 Edge ? ) 所 依赖 的 。
无论 如何 , 这 听 起来 像 是 故障 PC 从 一 开始 就 不能 直接 访问 互联 网 , 只能 通过 代理 。 Indy 在 任何 平台 上 都 没有 任何 " 系统 代理 " 的 概念 , 所以 你 必须 手动 将 代理 设置 分配 给 TIdHTTP , 正如 你 所 发现 的 。

相关问题