一、libcurl是什么?
瑞士军刀级网络传输库
支持HTTP/HTTPS/FTP等20+协议
跨平台(Windows/Linux/Mac通吃)
多线程安全,百万级并发不虚
二、快速安装(以Ubuntu为例)
# 安装开发库
sudo apt-get install libcurl4-openssl-dev
Windows用户:到curl官网下载预编译包
三、常用接口详解(手把手调教CURL)
1. 核心三剑客
// 创建句柄(买车)
CURL* curl = curl_easy_init();
// 配置参数(改装)
curl_easy_setopt(curl, 选项, 参数);
// 执行请求(飙车)
CURLcode res = curl_easy_perform(curl);
// 清理句柄(报废)
curl_easy_cleanup(curl);
2. 高频设置选项(改装秘籍)
基础必装
CURLOPT_URL // 设置请求地址(方向盘)
CURLOPT_WRITEFUNCTION // 设置数据回调函数(油箱)
CURLOPT_WRITEDATA // 传递接收数据的指针(车牌号)
数据传输
CURLOPT_POSTFIELDS // POST数据(装货)
CURLOPT_POSTFIELDSIZE // POST数据大小(称重)
CURLOPT_UPLOAD // 启用文件上传(集装箱模式)
安全配置
CURLOPT_SSL_VERIFYPEER // 验证SSL证书(防钓鱼)
CURLOPT_CAINFO // 指定CA证书路径(安保合同)
CURLOPT_SSLCERT // 客户端证书(VIP通行证)
高级调参
CURLOPT_TIMEOUT // 总超时时间(死亡倒计时)
CURLOPT_CONNECTTIMEOUT // 连接超时(搭讪时限)
CURLOPT_FOLLOWLOCATION // 自动重定向(跟车模式)
3. 信息获取接口(行车记录仪)
long http_code = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
// 获取HTTP状态码(200=平安到达,404=迷路)
double speed;
curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD, &speed);
// 获取下载速度(单位:字节/秒)
4. 头部操作黑科技(伪装大师)
// 构建请求头(办假证)
struct curl_slist* headers = nullptr;
headers = curl_slist_append(headers, "User-Agent: Mozilla/5.0");
headers = curl_slist_append(headers, "Content-Type: application/json");
// 设置请求头
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
// 记得释放内存!(毁尸灭迹)
curl_slist_free_all(headers);
5、完整示例套餐(实战)
示例1:伪装浏览器访问
curl_easy_setopt(curl, CURLOPT_URL, "https://www.zhihu.com");
curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt"); // 携带cookie
示例2:上传文件
FILE* fp = fopen("test.zip", "rb");
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curl, CURLOPT_READDATA, fp);
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)file_size);
示例3:调试利器
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); // 开启详细日志
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, debug_callback); // 自定义调试
四、极简GET请求示例
#include
#include <curl/curl.h>
// 回调函数处理响应数据
static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
((std::string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
}
int main() {
CURL* curl = curl_easy_init();
std::string readBuffer;
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://httpbin.org/get"); // 测试网站
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); // 设置回调
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); // 接收缓冲区
CURLcode res = curl_easy_perform(curl); // 执行请求
if(res != CURLE_OK) {
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res);
} else {
std::cout << "响应数据:\n" << readBuffer; // 打印JSON响应
}
curl_easy_cleanup(curl); // 清理
}
return 0;
}
编译命令:
g++ demo.cpp -o demo -lcurl
五、常用功能扩展
1. POST请求(提交JSON数据)
// 在初始化代码后添加:
std::string jsonData = R"({"name":"张三","age":25})";
curl_slist* headers = nullptr;
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str());
2. 下载文件
FILE* fp = fopen("demo.jpg", "wb");
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); // 直接写入文件
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/image.jpg");
3. 设置超时
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L); // 10秒超时
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5L); // 连接超时5秒
六、性能优化技巧
- 复用连接池:保持CURL*对象长期存在,设置CURLOPT_TCP_KEEPALIVE
- 多线程安全:全局初始化时调用curl_global_init(CURL_GLOBAL_ALL)
- SSL验证:生产环境需设置证书路径
- curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/cacert.pem");
七、常见错误排查
CURLE_COULDNT_CONNECT:检查网络/防火墙
CURLE_SSL_CACERT:证书配置错误
CURLE_OPERATION_TIMEDOUT:调整超时参数
#C++网络编程 #libcurl黑科技 #开发效率提升
#C++网络编程 #libcurl黑科技 #接口全解(实测:用libcurl开发API客户端,比Python快3倍,代码量少50%!)
PS:需要HTTPS代理示例/文件上传代码?评论区扣1立马安排!