没有 SSL 时 IOHandlers 之间的区别

Difference between IOHandlers when there is no SSL

我正在使用 Indy 从 url 地址获取 JSON。我的代码使用 TIdSSLIOHandlerSocketOpenSSL 作为 IOHandler 用于 TIdHTTP

var IdHTTP: TIdHTTP;
    IdSSL: TIdSSLIOHandlerSocketOpenSSL; // IO handler #1
    IdnoSSL: TIdIOHandlerStack;          // IO handler #2
    JSON: String;

我很好奇,当 url 很简单 http://www.example.com 而不是 https://www.example.com 时,是否有理由使用 SSL 作为处理程序?

begin
  IdHTTP := TIdHTTP.Create;

  try
    IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
    IdHTTP.IOHandler := IdSSL;

    // IdnoSSL:= TIdIOHandlerStack.Create(IdHTTP);
    // IdHTTP.IOHandler :=  IdnoSSL;

    JSON := IdHTTP.Get('http://www.example.com');
  finally
    IdHTTP.Free;
  end;
end;

或者我应该删除 TIdSSLIOHandlerSocketOpenSSL 并在 TIdIOHandlerStack 中使用 noSSL 吗?

欢迎提供任何帮助或建议。

如果您分配 IdSSLTIdHTTP 将根据请求的是 HTTP 还是 HTTPS url 自动 enable/disable 它。因此,您可以始终分配 IdSSL,让 TIdHTTP 决定如何使用它。

另一方面,如果您根本不需要 HTTPS,则根本不需要分配任何 IOHandler(您几乎不需要 IdnoSSL)。连接到服务器时,如果尚未分配 IOHandler,Indy 将为您创建默认 TIdIOHandlerStack

如果您使用的是最新版本的 Indy,并且不需要自定义 SSL/TLS 设置,那么 you don't need to manually assign an IOHandler for HTTPS.

但是,如果您尝试在没有分配 SSL IOHandler(手动或其他方式)的情况下请求 HTTPS url,您将收到 EIdIOHandlerPropInvalid 异常。