如何在Delphi Indy中实现带自定义DNS解析的HTTPS请求?
在Delphi中用Indy实现带自定义DNS解析的HTTPS请求
当然可以用Indy实现这个需求!核心逻辑和你在Synapse里做的补丁思路一致:先通过自定义DNS(比如Cloudflare的1.1.1.1)解析出目标域名的IP,然后直接连接该IP,但必须确保HTTP请求的Host头严格设置为原域名(比如api.binance.com)——这正是服务器验证身份的关键。
具体实现步骤
用TIdDNSResolver完成自定义DNS解析
先创建TIdDNSResolver组件,指定Cloudflare的DNS服务器,解析目标域名的A记录,拿到对应的IP地址。配置TIdHTTP发起请求
不要直接把IP填入完整URL后就发送请求(那样Indy会自动把Host头设为IP,导致服务器拒绝),而是要:- 用解析到的IP构造URL(保留协议和路径)
- 手动给
TIdHTTP.Request.CustomHeaders添加Host头,值为原域名api.binance.com
完整代码示例
procedure TYourForm.ExecuteCustomDNSHTTPSRequest; var DNSResolver: TIdDNSResolver; TargetIP: string; HTTP: TIdHTTP; SSLHandler: TIdSSLIOHandlerSocketOpenSSL; ResponseContent: string; begin // 1. 自定义DNS解析获取api.binance.com的IP DNSResolver := TIdDNSResolver.Create(nil); try DNSResolver.Host := '1.1.1.1'; // Cloudflare公共DNS DNSResolver.QueryType := qtA; // 请求A记录(IPv4地址) DNSResolver.Resolve('api.binance.com'); if DNSResolver.Records.Count = 0 then raise Exception.Create('无法解析目标域名的IP地址'); // 取第一条解析结果(可以扩展为循环尝试多条IP) TargetIP := DNSResolver.Records[0].IPAddress; finally DNSResolver.Free; end; // 2. 发起带正确Host头的HTTPS请求 HTTP := TIdHTTP.Create(nil); SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); try HTTP.IOHandler := SSLHandler; // 关键:强制设置Host头为原域名,覆盖Indy默认的IP值 HTTP.Request.CustomHeaders.Add('Host: api.binance.com'); // 用解析到的IP构造请求URL ResponseContent := HTTP.Get('https://' + TargetIP + '/api/v1/time'); // 处理响应结果,比如打印或解析 ShowMessage('响应结果:' + ResponseContent); except on E: Exception do ShowMessage('请求失败:' + E.Message); finally SSLHandler.Free; HTTP.Free; end; end;
为什么这样能成功?
当你直接用IP访问https://205.251.219.20/api/v1/time时,浏览器或默认的Indy请求会把Host头设为205.251.219.20,而Binance的服务器只认可api.binance.com作为合法的Host标识。我们手动添加的Host头会覆盖Indy自动生成的IP值,让服务器认为这是来自合法域名的请求,自然就能正常响应了。
这种方式和你在Synapse里的补丁逻辑本质相同:Synapse补丁是直接连接解析后的IP,但请求的Host还是原域名;Indy这里则是通过显式设置Host头达到同样的效果。
内容的提问来源于stack exchange,提问作者Michael Gendelev
相关产品推荐
相关产品推荐

