最成熟跨平台方式是使用libcurl库。它封装网络协议细节,支持HTTPS、重定向、Cookie等,API稳定且文档完善;需按平台安装并调用curl_global_init/cleanup;GET/POST请求需设置URL、回调函数、超时等选项,并注意内存与错误处理。

用 C++ 发送 HTTP 请求最成熟、跨平台的方式是使用 libcurl 库。它底层封装了网络协议细节,支持 HTTPS、重定向、Cookie、上传下载、超时控制等,且 API 稳定、文档完善。
一、环境准备:安装与链接 libcurl
不同平台安装方式略有差异:
-
Linux(Ubuntu/Debian):运行
sudo apt install libcurl4-openssl-dev,编译时加-lcurl -
macOS:用 Homebrew 安装
brew install curl,链接时通常无需额外指定(系统自带或 brew 提供的 curl 已含开发头文件) -
Windows(MSVC):推荐用 vcpkg:
vcpkg install curl:x64-windows,然后在项目中配置 include 和 lib 路径
确保包含头文件:#include ,并在程序开始调用 curl_global_init(CURL_GLOBAL_DEFAULT);,结束前调用 curl_global_cleanup();
二、基础 GET 请求示例
以下是最简可用的同步 GET 请求代码:
立即学习“C++免费学习笔记(深入)”;
CURL* curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/get");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); // 自动跳转
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L); // 10 秒超时
// 捕获响应体到字符串
std::string response;
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, [](void ptr, size_t size, size_t nmemb, void userp) -> size_t {
auto& str = static_cast>(userp);
size_t len = size nmemb;
str.append(static_cast>(ptr), len);
return len;
});
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
CURLcode res = curl_easy_perform(curl);
if (res == CURLE_OK) {
printf("Response: %s\n", response.c_str());
} else {
fprintf(stderr, "curl error: %s\n", curl_easy_strerror(res));
}
curl_easy_cleanup(curl);
}
关键点:
-
CURLOPT_WRITEFUNCTION是必须设置的回调,用于接收服务器返回的数据 -
CURLOPT_WRITEDATA传入用户数据指针(如&response),在回调中通过userp获取 - 不要忽略
curl_easy_cleanup,否则会内存泄漏
三、带请求头和 POST 数据的请求
发送 JSON POST 请求常见于调用 REST API:
std::string json_data = R"({"key":"value"})";
struct curl_slist* headers = nullptr;
headers = curl_slist_append(headers, "Content-Type: application/json");
headers = curl_slist_append(headers, "Accept: application/json");
curl_easy_setopt(curl, CURLOPT_URL, "https://www.php.cn/link/dc076eb055ef5f8a60a41b6195e9f329");
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_data.c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
// 执行后记得释放 header 列表
curl_slist_free_all(headers);
注意:
-
CURLOPT_POSTFIELDS直接传字符串指针,libcurl 会自动设置Content-Length - 若需手动控制 body(如流式上传),改用
CURLOPT_READFUNCTION+CURLOPT_READDATA - Header 列表用完必须调用
curl_slist_free_all
四、错误处理与调试技巧
生产环境务必检查返回值并开启调试信息:
- 每次
curl_easy_setopt不会报错,但错误常出现在curl_easy_perform中,应检查其返回值 - 启用详细日志:
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);,输出到终端便于排查连接、SSL、重定向问题 - 获取 HTTP 状态码:
long http_code = 0; curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); - SSL 验证失败(如自签名证书)可临时禁用:
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);(仅测试用,切勿上线)
不复杂但容易忽略。










