0

0

c++怎么调用web api接口_c++ libcurl库引入与HTTP POST请求【实战】

尼克

尼克

发布时间:2026-01-07 19:25:28

|

362人浏览过

|

来源于php中文网

原创

libcurl是C++调用Web API最成熟跨平台选择;Linux用apt安装,macOS用Homebrew,Windows推荐vcpkg;发JSON POST需设CURLOPT_POSTFIELDS、Content-Type头、WriteCallback,并处理重定向、gzip、SSL验证等细节。

c++怎么调用web api接口_c++ libcurl库引入与http post请求【实战】

用 C++ 调用 Web API 接口,libcurl 是最成熟、跨平台、可控性最强的选择;它不依赖 Qt 或 Boost 等大型框架,适合嵌入式、服务端或轻量 CLI 工具场景。

怎么引入 libcurl(Windows / Linux / macOS)

不同系统下,libcurl 的获取和链接方式差异明显,直接决定后续能否编译通过:

  • Linux(Ubuntu/Debian):sudo apt install libcurl4-openssl-dev,编译时加 -lcurl
  • macOS:用 Homebrew 安装 brew install curl,头文件在 /opt/homebrew/include/curl/(Apple Silicon),链接时加 -lcurl,注意可能需指定路径:-L/opt/homebrew/lib
  • Windows:推荐用 vcpkg:vcpkg install curl:x64-windows,然后在 CMake 中 find_package(CURL REQUIRED);手动链接容易漏 ws2_32.libwldap32.lib,导致 undefined reference to 'curl_easy_init'

怎么发一个标准 JSON POST 请求

多数 Web API 要求 Content-Type: application/json,且请求体是 UTF-8 编码的 JSON 字符串。关键点不在“发出去”,而在“发得对”:

  • 必须调用 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_str.c_str()),不能只设 URL 后靠 GET 拼参
  • 必须显式设置 Content-Type header:struct curl_slist* headers = nullptr; headers = curl_slist_append(headers, "Content-Type: application/json"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
  • json_str 必须是 std::string(非 const char* 临时字面量),否则 curl 可能在发送中途读到已释放内存
  • 务必检查返回值:CURLcode res = curl_easy_perform(curl);res != CURLE_OK 时,用 curl_easy_strerror(res) 查错,而不是只看 HTTP 状态码
#include 
#include 
#include 

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; CURLcode res; std::string readBuffer; std::string json = R"({"name":"Alice","age":30})";

curl = curl_easy_init();
if (!curl) return -1;

curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/post");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, json.length());

struct curl_slist* headers = nullptr;
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);

res = curl_easy_perform(curl);
if (res != CURLE_OK) {
    std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << "\n";
} else {
    long http_code = 0;
    curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
    std::cout << "HTTP " << http_code << "\n" << readBuffer << "\n";
}

curl_slist_free_all(headers);
curl_easy_cleanup(curl);
return 0;

}

OpenJobs AI
OpenJobs AI

AI驱动的职位搜索推荐平台

下载

立即学习C++免费学习笔记(深入)”;

为什么 response 返回空或乱码?常见陷阱

不是接口没响应,而是 libcurl 默认不处理重定向、不自动解压、不校验证书——这些都得手动开:

  • 遇到 301/302 重定向但没跳转?补上:curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
  • 返回 gzip 压缩内容却显示乱码?加:curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "");(空字符串表示接受所有编码,libcurl 自动解压)
  • HTTPS 请求失败,报 SSL certificate problem?开发阶段可临时禁用验证:curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);(上线前必须删掉)
  • 中文字段在 response 里变成 \u4f60\u597d?那是服务器返回了 Unicode 转义,不是 libcurl 的问题;解析 JSON 时用支持 UTF-8 的库(如 nlohmann/json),别用手工 substr

真正难的不是写通第一个请求,而是让错误可定位、超时可控制、证书可配置、JSON 可解析、重定向可追溯——这些细节堆起来,才构成一次生产可用的 API 调用。

相关专题

更多
视频后缀名都有哪些
视频后缀名都有哪些

视频后缀名都有avi、mpg、mpeg、rm、rmvb、flv、wmv、mov、mkv、ASF、M1V、M2V、MPE、QT、VOB、RA、RMJ、RMS、RAM、等等。更多关于视频后缀名的相关知识,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

3393

2023.10.31

C++ Qt图形开发
C++ Qt图形开发

本专题专注于 C++ Qt框架在图形界面开发中的应用,系统讲解窗口设计、信号与槽机制、界面布局、事件处理、数据库连接与跨平台打包等核心技能,通过多个桌面应用项目实战,帮助学员快速掌握 Qt 框架并独立完成跨平台GUI软件的开发。

68

2025.08.15

C++ 图形界面开发基础(Qt方向)
C++ 图形界面开发基础(Qt方向)

本专题系统讲解 使用 C++ 与 Qt 进行图形界面(GUI)开发的核心技能,内容涵盖 Qt 项目结构、窗口组件、信号与槽机制、事件处理、布局管理、资源管理,以及跨平台编译与打包流程。通过多个小型桌面应用实战案例,帮助学习者掌握从界面设计到功能实现的完整 GUI 开发能力。

52

2025.12.05

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

406

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

531

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

java学习网站推荐汇总
java学习网站推荐汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.8万人学习

Git 教程
Git 教程

共21课时 | 2.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号