尝试连接时出现TidHTTP错误“需要端口”

时间:2019-01-19 19:02:35

标签: delphi-7 indy

我正在尝试使用TIdHTTP组件连接到安全服务器。我已经为TIdSSLIOHandlerSocketOpenSSL属性分配了IOHandler I / O处理程序,并且我已经下载了OpenSSL文件。

当我调用Connect()时,它会生成“需要端口”异常。 Another post建议为Host自动分配PortTIdHTTP。关于我在做什么错的任何建议吗?

如果我不调用Connect(),则该站点将响应406,因为连接不安全。

代码的相关位是:

try
  IdHttp1.Connect ('https://test-api.service.hmrc.gov.uk');
  IdHttp1.Request.CustomHeaders.AddValue ('Accept', 'application/vnd.hmrc.1.0+json');

  result := IdHTTP1.Get('https://test-api.service.hmrc.gov.uk/hello/world');
except
  on E: Exception do
    memo1.lines.add (E.ClassName + ': ' + E.message);
end;

1 个答案:

答案 0 :(得分:1)

“需要端口”错误是因为在调用Port时尚未为Connect()属性分配值。

但是,问题是,与其他TCP客户端组件不同,使用Connect()时根本不应该直接调用TIdHTTP 。其Get()方法(和其他请求方法)将为您内部处理。因此,您需要从代码中删除Connect()调用。

HTTP是无状态协议。在对同一服务器的多个请求之间,基础TCP连接可以是持久的,也可以是断开的。客户端和服务器根据每个请求进行协商。 TIdHTTP通过解析用于获取主机和端口信息的URL(如我在您提到的另一篇文章中所述)并根据需要断开/重新连接TCP连接,来为您内部处理该详细信息。

您要做的就是为Get()(及其他)提供有效的URL,并让TIdHTTP为您管理TCP连接。

另外,您不应该使用Request.CustomHeaders属性来设置Accept请求标头。请改用Request.Accept属性。

尝试一下:

IdHttp1.Request.Accept := 'application/vnd.hmrc.1.0+json';
try
  Result := IdHTTP1.Get('https://test-api.service.hmrc.gov.uk/hello/world');
except
  on E: Exception do
    Memo1.Lines.Add(E.ClassName + ': ' + E.message);
end;

对于响应代码406,您完全得到任何响应的事实意味着您具有到服务器的有效HTTP连接。但是406并不表示您所声称的连接是不安全的(实际上,它不是,因为您正在请求HTTPS URL)。 406实际上意味着服务器无法以您明确要求的可接受格式发送响应数据。在这种情况下,无法以所需的JSON格式给出响应。

因此,您需要弄清楚服务器为什么不发送JSON并进行修复,或者您需要修改Accept请求标头以包括服务器想要使用的格式。

我的猜测是服务器可能正在尝试以非JSON格式(也许以HTML格式)发送回错误消息,因此请尝试暂时删除Accept请求标头,以便您可以查看实际的响应,然后根据需要更新请求代码。