Delphi:TIdHTTP与TNetHTTPClient的区别

9

我正在使用Delphi编写一个下载管理器,其中包括诸如可恢复下载和通过代理进行下载等自定义功能。

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

  • TNetHTTPClient似乎是winhttp.dll的接口。

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

  • TIdHTTP看起来是一个非常古老的组件(也许非常稳定/经过测试),并且有大量在线文档。

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

我有些犹豫...应该选择哪个?

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

我的问题有些有争议(主要基于观点),但我没有找到任何实际比较这两个组件的内容。

2个回答

13

TNetHTTPClient在Delphi XE8中推出。

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

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

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

TIdHTTP依赖于OpenSSL来支持HTTPS。 您将需要在应用程序中附带两个DLL。 OpenSSL是一个开源项目。 一些组织对包含开源组件的软件有问题。 我们的一个产品使用TIdFTP和OpenSSL来支持FTPS。 偶尔我们会有用户询问该产品是否可以在没有这些DLL的情况下正常工作(没有FTPS),因为它们的存在使得该软件更难被他们的组织批准使用。

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


2
“*TIdHTTP 依赖于 OpenSSL 来支持 HTTPS*” - 实际上,它仅仅是默认使用 OpenSSL,因为这是 Indy 捆绑的默认实现。但从技术上讲,它并不需要 OpenSSL。您可以使用任何 SSL/TLS 库,只需将其包装在 TIdSSLIOHandlerSocketBase 派生类中,然后将其附加到 TIdHTTP(或任何其他基于 TCP 的组件)即可。例如,Eldos SecureBlackbox 提供了一个这样的包装器类来支持其 SSL/TLS 引擎。Indy 团队正在开发一个 SChannel 包装器作为 OpenSSL 在 Windows 上的替代品。 - Remy Lebeau
1
我用过Remy提到的OpenSSL和Eldos SBB来配合TIdHTTP使用。 Eldos有点贵,但它很好,因为它将所有内容编译在内部,不使用额外的DLL。 - Toby
我在依赖WinInet/WinHttp时遇到的一个大问题是,我找不到一种按应用程序设置协议的方法。看起来你必须为操作系统设置协议,然后你就被限定在那里了。但这可能只是因为我的无知。 - Toby

8

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

TIdHTTP是手动实现的HTTP。

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


TNetHTTPClient和TIdHTTP哪个更快、更可靠?我一直使用idHTTP,但从我的基准测试来看,TNetHTTPClient似乎更快。 - ar099968
@CescoBagnoli 我无法回答这个问题。我们从未进行过任何类似的基准测试比较。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接