c++ rest客户端需选对第三方库并处理异步/ssl/错误;libcurl最稳但须确保https支持,cpp-httplib轻量但无连接复用;json解析推荐nlohmann/json并严格校验结构。

C++ 本身没有内置的 REST 客户端,得靠第三方库;不选对库或不处理好异步/SSL/错误,接口调用大概率卡死、崩溃或返回乱码。
用 libcurl 发 GET 请求最稳,但默认不支持 HTTPS(没编译 SSL)会直接失败
绝大多数生产环境要走 https://,而系统自带的 libcurl(比如 CentOS 默认装的)常被编译成不带 OpenSSL 或 mbedtls 支持。运行时调 curl_easy_perform() 可能静默返回 CURLE_UNSUPPORTED_PROTOCOL,或者报错 SSL connect error。
- 先检查:运行
curl --version,看输出里有没有HTTPS或具体 SSL 库名(如OpenSSL/1.1.1w) - 没 HTTPS 支持?别硬改代码——重装带 SSL 的
libcurl(Ubuntu:用apt install libcurl4-openssl-dev;macOS:用brew install curl-openssl && brew link --force curl-openssl) - 代码里必须显式调
curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 0L)关证书校验(仅测试用),否则自签名或内网证书会触发CURLE_SSL_CACERT - 别忘了设
CURLOPT_TIMEOUT和CURLOPT_CONNECTTIMEOUT,否则 DNS 卡住或服务不可达时线程会挂住几十秒
cpp-httplib 适合小项目,但默认不并发,多请求串行跑会拖慢整体响应
这个 header-only 库写法清爽,httplib::Client 构造即连接,.Get() 阻塞直到响应收完。它不管理连接池,也不复用 TCP 连接——每个请求都新建 socket,三次握手 + TLS 握手全来一遍。
- 高频调用(比如每秒 10+ 次)时,延迟飙升,CPU 花在握手而非业务上
- 解决办法只有两个:
httplib::Client复用实例(别每次 new)、手动开httplib::Client::enable_server_certificate_verification(false)(同上,仅调试) - 如果需要并发请求,别自己加线程扔一堆
Client实例——改用libcurl+ multi interface,或切到boost.beast - 示例里常见漏掉
res->body判空,实际返回可能是空字符串或重定向响应,直接json::parse()会 throw
JSON 解析别手写,nlohmann/json 是目前 C++ 里最省心的选项
用 std::string 拼接字段、find() 找引号、substr() 截取——这种写法在字段嵌套两层以上就崩,且完全不校验格式。而 nlohmann/json 对 std::string_view 友好,支持隐式转换,报错信息也清楚。
立即学习“C++免费学习笔记(深入)”;
- 读取响应体后,第一行就该是
auto j = json::parse(body, nullptr, false);(第三个参数false表示不 throw,出错返回json::value_t::discarded) - 访问字段前务必用
j.contains("data") && j["data"].is_object()套两层判断,HTTP 返回成功不等于 JSON 结构符合预期 - 别把
json::object直接传给日志函数——它可能含二进制或控制字符,打出来终端乱码甚至卡死,先转j.dump()再截断长度 - 注意
nlohmann/json默认最大嵌套深度是 100,超深 JSON(如某些配置导出)会报parse_error,需提前调json::max_size(200)
真正麻烦的从来不是“怎么发个请求”,而是错误路径覆盖不全:DNS 失败、连接被 reset、TLS 版本不匹配、响应体截断、JSON 字段类型突变、服务端限流返回 429 却没重试逻辑……这些点单测很难打全,上线后才暴露。










