为何调用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; }
测试步骤
- 替换代码中的
your-real-inspect-id为你在requestinspector.com创建的实际ID; - 用原命令编译:
gcc http.c -lwininet && ./a.exe; - 若仍失败,检查本地网络是否能正常访问requestinspector.com,或临时关闭防火墙/杀毒软件测试。
内容的提问来源于stack exchange,提问作者loaded_dypper
相关产品推荐
相关产品推荐

