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...
我在 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...