C++Builder 中带有 Indy IdHTTP 的 HTTPS 网址

HTTPS web addresses with Indy IdHTTP in C++Builder

我在 C++Builder XE4 VCL 32 位中使用下面的代码。我正在使用 Indy 组件,版本 10.6.0.497。

我一直在 IdHTTP->Get() 使用 HTTP 地址,现在已更改为 HTTPS。我相信我需要创建一个 TIdSSLIOHandlerSocketOpenSSL 组件并将其添加到 TIdHTTP 作为它的 IOHandler.

当我尝试这样做时,下面的代码给出了错误:

E2451 Undefined symbol 'TIdSSLIOHandlerSocketOpenSSL'

错误在代码上,std::auto_ptr<TIdSSLIOHandlerSocketOpenSSL>

我不确定为什么 TIdSSLIOHandlerSocketOpenSSL 未定义,因为我安装了 Indy 并且可以使用 TIdSSLIOHandlerSocketOpenSSL 作为组件面板中的传统组件。

谁能告诉我如何设置此代码以使用 HTTPS 地址?

std::auto_ptr<TIdSSLIOHandlerSocketOpenSSL> Local_IOHandler( new TIdSSLIOHandlerSocketOpenSSL( NULL ) );
//error: E2451 Undefined symbol 'TIdSSLIOHandlerSocketOpenSSL'
//error: E2299 Cannot generate template specialization from 'std::auto_ptr<_Ty>'


std::auto_ptr<TIdHTTP> Local_IdHTTP( new TIdHTTP( NULL ) );
Local_IdHTTP->Name="MyLocalHTTP";
Local_IdHTTP->HandleRedirects=true;
Local_IdHTTP->IOHandler=Local_IOHandler;

TStringStream *jsonToSend = new TStringStream;

UnicodeString GetURL = "https://chartapi.finance.yahoo.com/instrument/1.0/CLZ17.NYM/chartdata;type=quote;range=1d/csv/";

jsonToSend->Clear();
try
{
    Local_IdHTTP->Get(GetURL, jsonToSend);
}
catch (const Exception &E)
{
    ShowMessage( E.Message );
    //error: IOHandler value is not valid
}

When I try to do this the code below gives the error E2451 Undefined symbol 'TIdSSLIOHandlerSocketOpenSSL'

#include <IdSSLOpenSSL.hpp> 添加到您的代码中。

I am not sure why 'TIdSSLIOHandlerSocketOpenSSL' is Undefined because I have Indy installed and can use 'TIdSSLIOHandlerSocketOpenSSL' as a traditional component from the compoenent pallet?

在设计时将组件拖放到窗体上会自动为您生成任何必要的 #include 语句。 TIdSSLIOHandlerSocketOpenSSL 也不例外。

话虽这么说,一旦你解决了这个问题,你就不能将 std::auto_ptr 本身分配给 IOHandler。您需要使用它的 get() 方法来获取对象指针:

Local_IdHTTP->IOHandler = Local_IOHandler.get();

并且您也应该考虑将 std::auto_ptr 用于您的 TStringStream

std::auto_ptr<TStringStream> json( new TStringStream );
Local_IdHTTP->Get(GetURL, json.get());
// use json as needed...

尽管在这种情况下,我建议使用 TIdHTTP::Get() 的重载版本,即 returns 和 String,但使用 TStringStream 没有任何好处:

String json = Local_IdHTTP->Get(GetURL);
// use json as needed...