我正在尝试使用TIdHTTP
组件连接到安全服务器。我已经为TIdSSLIOHandlerSocketOpenSSL
属性分配了IOHandler
I / O处理程序,并且我已经下载了OpenSSL文件。
当我调用Connect()
时,它会生成“需要端口”异常。 Another post建议为Host
自动分配Port
和TIdHTTP
。关于我在做什么错的任何建议吗?
如果我不调用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;
答案 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
请求标头,以便您可以查看实际的响应,然后根据需要更新请求代码。