使用libcurl库可在C++中发起HTTP请求。首先安装开发库,如Ubuntu下执行sudo apt-get install libcurl4-openssl-dev;然后编写代码,通过curl_easy_init初始化,设置CURLOPT_URL、CURLOPT_WRITEFUNCTION等选项,结合回调函数接收响应数据,执行curl_easy_perform发送GET或POST请求,最后调用curl_easy_cleanup释放资源。示例包含同步GET请求获取数据及POST请求发送JSON内容,适用于跨平台项目,需注意超时设置、HTTPS证书处理及多线程安全。

在C++中发起HTTP请求没有像Python或JavaScript那样的内置支持,但可以通过第三方库来实现。最常用且简单的方法是使用 libcurl,它是一个功能强大、跨平台的网络请求库,支持HTTP、HTTPS等多种协议。
1. 安装并配置 libcurl
在使用之前,需要确保系统中已安装 libcurl 开发库。Ubuntu/Debian:
sudo apt-get install libcurl4-openssl-dev
CentOS/RHEL:
sudo yum install curl-devel
Windows(使用vcpkg):
立即学习“C++免费学习笔记(深入)”;
vcpkg install curl
2. 基本的HTTP GET请求示例
以下是一个使用 libcurl 发起同步HTTP GET请求的完整示例:
#include zuojiankuohaophpcniostreamyoujiankuohaophpcn
#include zuojiankuohaophpcnstringyoujiankuohaophpcn
#include zuojiankuohaophpcncurl/curl.hyoujiankuohaophpcn
// 回调函数:接收响应数据
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) {
size_t totalSize = size * nmemb;
output-youjiankuohaophpcnappend((char*)contents, totalSize);
return totalSize;
}
int main() {
CURL* curl;
CURLcode res;
std::string readBuffer;
// 初始化curl
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/get");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L); // 超时10秒
// 执行请求
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr zuojiankuohaophpcnzuojiankuohaophpcn "请求失败: " zuojiankuohaophpcnzuojiankuohaophpcn curl_easy_strerror(res) zuojiankuohaophpcnzuojiankuohaophpcn std::endl;
} else {
std::cout zuojiankuohaophpcnzuojiankuohaophpcn "响应内容:\n" zuojiankuohaophpcnzuojiankuohaophpcn readBuffer zuojiankuohaophpcnzuojiankuohaophpcn std::endl;
}
// 清理
curl_easy_cleanup(curl);
} else {
std::cerr zuojiankuohaophpcnzuojiankuohaophpcn "curl初始化失败" zuojiankuohaophpcnzuojiankuohaophpcn std::endl;
}
return 0;
}3. 编译方法
保存为 http_request.cpp,然后编译:
g++ http_request.cpp -o http_request -lcurl
运行:
./http_request
4. 发起POST请求示例
发送JSON数据到服务器:
#include zuojiankuohaophpcniostreamyoujiankuohaophpcn
#include zuojiankuohaophpcnstringyoujiankuohaophpcn
#include zuojiankuohaophpcncurl/curl.hyoujiankuohaophpcn
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) {
output-youjiankuohaophpcnappend((char*)contents, size * nmemb);
return size * nmemb;
}
int main() {
CURL* curl;
CURLcode res;
std::string readBuffer;
std::string postData = R"({"name": "张三", "age": 25})";
curl = curl_easy_init();
if (curl) {
struct curl_slist* headers = nullptr;
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/post");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, postData.length());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr zuojiankuohaophpcnzuojiankuohaophpcn "POST请求失败: " zuojiankuohaophpcnzuojiankuohaophpcn curl_easy_strerror(res) zuojiankuohaophpcnzuojiankuohaophpcn std::endl;
} else {
std::cout zuojiankuohaophpcnzuojiankuohaophpcn "POST响应:\n" zuojiankuohaophpcnzuojiankuohaophpcn readBuffer zuojiankuohaophpcnzuojiankuohaophpcn std::endl;
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
return 0;
}5. 注意事项
使用 libcurl 时需注意以下几点:
- 每次使用后调用 curl_easy_cleanup 避免资源泄漏
- 设置超时时间防止程序卡死
- 处理 HTTPS 时可能需要设置 CA 证书路径(或跳过验证,仅用于测试)
- 多线程环境下每个线程应使用独立的 CURL* 句柄
基本上就这些。libcurl 是C++中最稳定可靠的HTTP请求方案之一,适合大多数项目需求。











