示例网址: https://api.binance.com/api/v1/time
使用TIdDNSResolver和cloudflare dns我可以获得主机IP。
形式的直接请求https://205.251.219.20/api/v1/time
不起作用,因为据我所知,服务器希望在网址中看到“api.binance.com”。 (即使在浏览器中它也不起作用)
使用synapce和以下补丁将请求的主机替换为已解析的IP我使其正常工作
function THTTPSend.InternalDoConnect(needssl: Boolean): Boolean;
begin
Result := False;
FSock.CloseSocket;
FSock.Bind(FIPInterface, cAnyPort);
if FSock.LastError <> 0 then
Exit;
If ResolvedIP.IsEmpty
then FSock.Connect(FTargetHost, FTargetPort)
else FSock.Connect(ResolvedIP, FTargetPort); // !!
使用Indy有没有办法做同样的事情?
答案 0 :(得分:3)
默认情况下,TIdHTTP
使用由请求的URL指定/推断的Host:Port。要更改此行为,您必须更改TIdHTTP
的源代码,例如TIdCustomHTTP.SetHostAndPort()
或TIdCustomHTTP.CheckAndConnect()
方法(两者都不是virtual
),然后重新编译Indy。
或者,您可以使用TIdHTTP
的{{1}}或OnSocketAllocated
事件(On(Before|After)Bind
中没有提升为published
,因此您必须在运行时手动访问它们)将TIdHTTP
属性更改为您要连接的任何IP地址。这不会对TIdHTTP.IOHandler.Host
发送的HTTP标头产生任何影响,例如TIdHTTP
,它仍将从网址中获取。
或者,如果您希望Indy的所有Host-to-IP DNS查询都通过Cloudflare,您可以从Host
(或您感兴趣的任何特定于平台的后代)派生自定义类,例如{ {1}}),覆盖其虚拟TIdStack
方法以执行您想要的任何DNS查询,然后在程序启动之前将您的类类型传递到TIdStackWindows
单元中的HostByName()
函数Indy类被实例化。