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

为何调用HttpSendRequest发送请求失败?报错12029及代码示例

解决WinINet发送HTTPS请求报错12029的问题

错误代码12029对应ERROR_INTERNET_CANNOT_CONNECT,核心原因是无法建立到目标服务器的网络连接。你的代码存在几个关键问题,逐一修正后即可解决:

1. 错误检查逻辑错误

InternetConnect执行后,你错误地检查hSession == NULL,而不是hConnect == NULL,这会导致InternetConnect失败时无法及时发现,掩盖了前置步骤的错误。

2. 路径占位符未替换

HttpOpenRequest中的路径/inspect/<id>是占位符,必须替换为requestinspector.com提供的实际ID,否则请求的是无效资源,服务器会拒绝连接。

3. 字符编码不统一

代码混合使用ANSI(char、printf)和Unicode(_T宏)的WinINet调用,参数不匹配会引发隐性错误。建议统一使用ANSI版本(函数后缀加A)或Unicode版本(后缀加W)。

4. HTTPS请求缺少必要标志

建立HTTPS连接时,必须添加INTERNET_FLAG_SECURE标志,确保启用SSL/TLS加密。仅用INTERNET_FLAG_IGNORE_CERT_CN_INVALID不足以触发HTTPS连接。

5. 代理配置干扰

INTERNET_OPEN_TYPE_PRECONFIG会读取系统代理设置,如果代理配置错误,会导致无法连接目标服务器。可以尝试用INTERNET_OPEN_TYPE_DIRECT绕过代理测试。


修正后的示例代码

#include <windows.h>
#include <wininet.h>
#include <stdio.h>

void temp()
{
    BOOL success;
    HINTERNET hConnect = NULL, hSession = NULL, hRequest = NULL;
    const char hdrs[] = "Content-Type: application/json";
    
    PCSTR rgpszAcceptTypes[] = {"text/*", NULL};

    // 初始化会话,绕过系统代理
    hSession = InternetOpenA("", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if (hSession == NULL) {
        printf("InternetOpen Failed with error: %ld\n", GetLastError());
        goto cleanup;
    }

    // 建立HTTPS连接,添加安全标志
    hConnect = InternetConnectA(hSession, "requestinspector.com", INTERNET_DEFAULT_HTTPS_PORT, 
                               NULL, NULL, INTERNET_SERVICE_HTTP, 
                               INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID, 0);
    if (hConnect == NULL) {
        printf("InternetConnect Failed with error: %ld\n", GetLastError());
        goto cleanup;
    }

    // 替换为你在requestinspector.com获取的实际ID
    hRequest = HttpOpenRequestA(hConnect, "GET", "/inspect/your-real-inspect-id", 
                               NULL, NULL, rgpszAcceptTypes, 
                               INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID, 0);
    if (hRequest == NULL) {
        printf("HttpOpenRequest Failed with error: %ld\n", GetLastError());
        goto cleanup;
    }

    success = HttpSendRequestA(hRequest, hdrs, strlen(hdrs), NULL, 0);
    if (!success) {
        printf("HttpSendRequest Failed with error: %ld\n", GetLastError());
    } else {
        printf("Request sent successfully!\n");
        // 可在此添加读取响应内容的代码
    }

cleanup:
    // 释放WinINet资源,避免泄漏
    if (hRequest) InternetCloseHandle(hRequest);
    if (hConnect) InternetCloseHandle(hConnect);
    if (hSession) InternetCloseHandle(hSession);
}

int main() {
    temp();
    return 0;
}

测试步骤

  1. 替换代码中的your-real-inspect-id为你在requestinspector.com创建的实际ID;
  2. 用原命令编译:gcc http.c -lwininet && ./a.exe;
  3. 若仍失败,检查本地网络是否能正常访问requestinspector.com,或临时关闭防火墙/杀毒软件测试。

内容的提问来源于stack exchange,提问作者loaded_dypper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:21:58