C++如何发送HTTP请求?(libcurl库使用教程)

18次阅读

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

C++如何发送HTTP请求?(libcurl库使用教程)

用 C++ 发送 HTTP 请求最成熟、跨平台的方式是使用 libcurl 库。它底层封装了网络协议细节,支持 https、重定向、Cookie、上传下载、超时控制等,且 API 稳定、文档完善。

一、环境准备:安装与链接 libcurl

不同平台安装方式略有差异:

  • linuxubuntu/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: %sn", response.c_str()); } else { fprintf(stderr, "curl error: %sn", 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);(仅测试用,切勿上线)

不复杂但容易忽略。

text=ZqhQzanResources