Delphi:TIdHTTP 与 TNetHTTPClient

Sim*_*gro 8 delphi indy idhttp dotnet-httpclient

我正在 Delphi 中编写一个下载管理器,其中包含一些自定义功能,例如可恢复下载和通过代理下载。

我正在研究不同的组件解决方案:Indy 和 NetHTTP,两者看起来非常接近。

  • TNetHTTPClient好像是 的接口winhttp.dll。

  • TIdHTTP似乎是wininet.dll(但我不确定)的接口。

  • TIdHTTP 似乎是一个非常古老的组件(可能非常稳定/经过测试)并且有大量在线文档。

  • TNetHTTPClient 似乎是一个非常新的组件,并且没有很好的在线文档。

我有点犹豫……该选择哪一个?

关键是:这两个组件之间的主要区别是什么?

我的问题有点有争议(主要基于意见),但我还没有找到这两个组件之间的任何实际比较。

Jan*_*rts 12

TNetHTTPClient 在 Delphi XE8 中引入。

最重要的好处TNetHTTPClient是它允许您的应用程序支持 HTTPS,而无需您自己提供对 SSL/TLS 的支持。 TNetHTTPClient依赖于操作系统提供的 SSL/TLS 支持。

这意味着您不必在发现新漏洞时更新您的应用程序。您的客户将获得这些更新作为其操作系统更新的一部分。为您减少工作量并为您的客户提供更好的安全性(如果他们认为他们的操作系统供应商比您更擅长更新 SSL/TLS 库)。

这也意味着加密和解密 HTTPS 流量的代码不在您的应用程序中。因此,您的应用程序不受导入或导出加密算法的限制的影响。

TIdHTTP依靠 OpenSSL 来支持 HTTPS。您必须随应用程序一起提供两个 DLL。OpenSSL 是一个开源项目。一些组织在使用包含开源组件的软件方面存在问题。我们的一种产品使用TIdFTPOpenSSL 来支持 FTPS。我们不时有用户询问产品在没有这些 DLL 的情况下是否可以工作(它可以,但没有 FTPS),因为它们的存在使得在他们的组织中获得批准使用该软件变得更加困难。

我相信这一切也是 Embarcadero 的创作动机TNetHTTPClient(即使他们已经有了TIdHTTP)。它将确保 HTTPS 安全的责任从开发人员转移到操作系统。

  • “*`TIdHTTP` 依赖于 OpenSSL 来支持 HTTPS*”——实际上,它只是*默认* OpenSSL,因为这是与 Indy 捆绑的默认实现。但从技术上讲,它根本不需要* OpenSSL。你可以使用任何你想要的 SSL/TLS 库,你所需要的只是将它包装在一个 `TIdSSLIOHandlerSocketBase` 派生类中,然后你可以将它附加到 `TIdHTTP`(或任何其他基于 TCP 的组件)。例如,Eldos SecureBlackbox 为其 SSL/TLS 引擎提供了这样一个包装类。Indy 的团队正在开发一个 SChannel 包装器,作为 Windows 上 OpenSSL 的替代方案。 (2认同)

Rem*_*eau 7

Indy 根本不使用 WinInet/WinHTTP。它直接使用基于 BSD/POSIX 的跨平台套接字 API(如 Windows 上的 WinSock),完全从头开始实现 Internet 协议(如 HTTP)。

TIdHTTP 是一个手动的 HTTP 实现。

TNetHTTPClient,另一方面,包装系统提供的 HTTP API(如 Windows 上的 WinInet/WinHTTP)。