最成熟跨平台方式是使用libcurl库。它封装网络协议细节,支持HTTPS、重定向、Cookie等,API稳定且文档完善;需按平台安装并调用curl_global_init/cleanup;GET/POST请求需设置URL、回调函数、超时等选项,并注意内存与错误处理。
用 C++ 发送 HTTP 请求最成熟、跨平台的方式是使用 libcurl 库。它底层封装了网络协议细节,支持 HTTPS、重定向、Cookie、上传下载、超时控制等,且 API 稳定、文档完善。
不同平台安装方式略有差异:
sudo apt install libcurl4-openssl-dev,编译时加 -lcurl
brew install curl,链接时通常无需额外指定(系统自带或 brew 提供的 curl 已含开发头文件)vcpkg install curl:x64-windows,然后在项目中配置 include 和 lib 路径确保包含头文件:#include ,并在程序开始调用 curl_global_init(CURL_GLOBAL_DEFAULT);,结束前调用 curl_global_cleanup();
以下是最简可用的同步 GET 请求代码:
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,否则会内存泄漏发送 JSON POST 请求常见于调用 REST API:
std::string json_data = R"({"key":"value"})";
struct curl_slist* headers = nullpt
r;
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./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
CURLOPT_READFUNCTION + CURLOPT_READDATA
curl_slist_free_all
生产环境务必检查返回值并开启调试信息:
curl_easy_setopt 不会报错,但错误常出现在 curl_easy_perform 中,应检查其返回值curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);,输出到终端便于排查连接、SSL、重定向问题long http_code = 0; curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);(仅测试用,切勿上线)不复杂但容易忽略。