You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ Builder 6 如何使用INDY组件实现HTTPS请求?

C++ Builder 6 环境HTTPS请求实现方案

C++ Builder 6 环境完全可以实现HTTPS请求,常见有两种可行方案,具体实现如下:

方案一:升级INDY组件适配HTTPS

你当前使用的应该是默认不带SSL支持的INDY 9老版本,只要升级到适配BCB6的INDY 9/10版本,配套对应版本的OpenSSL库即可实现HTTPS请求,改动最小,可以复用原有HTTP相关逻辑。

  • 先卸载原有低版本INDY组件,安装适配C++ Builder 6的INDY 10最终兼容版,或者INDY 9的SSL扩展包,重新编译安装到BCB6的组件库中
  • 下载32位版本的libeay32.dll和ssleay32.dll(必须是1.0.2.x分支的32位版本,更高版本OpenSSL和老INDY接口不兼容),放到程序运行目录或者系统SysWOW64目录下

示例代码:

#include <IdHTTP.hpp>
#include <IdSSLIOHandlerSocketOpenSSL.hpp>

// HTTPS请求示例函数,POST传空则为GET请求
AnsiString __fastcall SendHttpsRequest(AnsiString url, AnsiString postData = "")
{
    TIdHTTP *IdHTTP = new TIdHTTP(NULL);
    TIdSSLIOHandlerSocketOpenSSL *sslHandler = new TIdSSLIOHandlerSocketOpenSSL(NULL);
    AnsiString result = "";
    try
    {
        // 绑定SSL处理组件
        IdHTTP->IOHandler = sslHandler;
        // 设置SSL版本,按需调整为sslvTLSv1、sslvTLSv1_1、sslvTLSv1_2
        sslHandler->SSLOptions->Method = sslvTLSv1_2;
        sslHandler->SSLOptions->Mode = sslmClient;
        // 自签名证书场景可禁用证书校验,生产环境建议开启
        sslHandler->SSLOptions->VerifyMode = TIdSSLVerifyModeSet();
        // 通用请求配置
        IdHTTP->Request->ContentType = "application/x-www-form-urlencoded";
        IdHTTP->Request->UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
        IdHTTP->ReadTimeout = 30000;
        IdHTTP->ConnectTimeout = 10000;
        
        if (postData.IsEmpty())
        {
            // 发起GET请求
            result = IdHTTP->Get(url);
        }
        else
        {
            // 发起POST请求
            TStringStream *postStream = new TStringStream(postData, TEncoding::UTF8);
            result = IdHTTP->Post(url, postStream);
            delete postStream;
        }
    }
    catch(Exception &e)
    {
        result = "ERROR:" + e.Message;
    }
    delete sslHandler;
    delete IdHTTP;
    return result;
}

方案二:使用WinHTTP原生API(无需额外组件)

如果不想改动现有INDY组件,可以直接调用Windows系统自带的WinHTTP 32位API,XP及以上系统都默认支持,无需额外部署依赖文件。
示例代码:

#include <winhttp.h>
#pragma comment(lib, "winhttp.lib")

// WinHTTP实现HTTPS请求,POST传空则为GET请求
AnsiString __fastcall WinHttpSendHttpsRequest(AnsiString url, AnsiString postData = "")
{
    AnsiString result = "";
    HINTERNET hSession = NULL, hConnect = NULL, hRequest = NULL;

    // 初始化WinHTTP会话
    hSession = WinHttpOpen(L"WinHTTP Client/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
    if(!hSession) goto __cleanup;

    // 解析请求URL
    WCHAR wszUrl[2048] = {0};
    MultiByteToWideChar(CP_ACP, 0, url.c_str(), url.Length(), wszUrl, 2047);
    URL_COMPONENTS urlComp = {0};
    urlComp.dwStructSize = sizeof(URL_COMPONENTS);
    urlComp.dwHostNameLength = (DWORD)-1;
    urlComp.dwUrlPathLength = (DWORD)-1;
    urlComp.dwSchemeLength = (DWORD)-1;
    if(!WinHttpCrackUrl(wszUrl, 0, 0, &urlComp)) goto __cleanup;

    // 建立服务端连接
    hConnect = WinHttpConnect(hSession, urlComp.lpszHostName, urlComp.nPort, 0);
    if(!hConnect) goto __cleanup;

    // 创建请求对象
    DWORD dwFlags = (urlComp.nScheme == INTERNET_SCHEME_HTTPS) ? WINHTTP_FLAG_SECURE : 0;
    hRequest = WinHttpOpenRequest(hConnect, postData.IsEmpty() ? L"GET" : L"POST", urlComp.lpszUrlPath, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, dwFlags);
    if(!hRequest) goto __cleanup;

    // 自签名证书场景禁用SSL校验,生产环境可删除该配置
    DWORD dwSslOpt = SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID | SECURITY_FLAG_IGNORE_CERT_CN_INVALID | SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE;
    WinHttpSetOption(hRequest, WINHTTP_OPTION_SECURITY_FLAGS, &dwSslOpt, sizeof(dwSslOpt));
    // 如需开启TLS1.2支持,添加以下配置(Win7及以上系统需安装对应补丁)
    // DWORD dwTlsOpt = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1 | WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1 | WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2;
    // WinHttpSetOption(hRequest, WINHTTP_OPTION_SECURE_PROTOCOLS, &dwTlsOpt, sizeof(dwTlsOpt));

    // 发送请求
    BOOL bSendRet = FALSE;
    if(postData.IsEmpty())
    {
        bSendRet = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
    }
    else
    {
        WCHAR wszHeader[] = L"Content-Type: application/x-www-form-urlencoded\r\n";
        DWORD dwDataLen = postData.Length();
        bSendRet = WinHttpSendRequest(hRequest, wszHeader, lstrlenW(wszHeader), postData.c_str(), dwDataLen, dwDataLen, 0);
    }
    if(!bSendRet) goto __cleanup;

    // 接收响应
    if(!WinHttpReceiveResponse(hRequest, NULL)) goto __cleanup;

    // 读取返回内容
    char szBuffer[4096] = {0};
    DWORD dwRead = 0;
    while(WinHttpReadData(hRequest, szBuffer, sizeof(szBuffer)-1, &dwRead) && dwRead > 0)
    {
        szBuffer[dwRead] = 0;
        result += AnsiString(szBuffer);
        memset(szBuffer, 0, sizeof(szBuffer));
    }

__cleanup:
    if(hRequest) WinHttpCloseHandle(hRequest);
    if(hConnect) WinHttpCloseHandle(hConnect);
    if(hSession) WinHttpCloseHandle(hSession);
    if(result.IsEmpty()) result = "ERROR:" + AnsiString(GetLastError());
    return result;
}

内容的提问来源于stack exchange,提问作者Allan.A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:27:00