用libcurl发get请求最稳:需调用curl_global_init/cleanup,每个请求独立init,设url、超时、writefunction回调存响应体到std::String,避免ostringstream。

用 libcurl 发 GET 请求最稳
c++ 标准库不带 http 客户端,libcurl 是事实标准,跨平台、成熟、可控。别碰那些封装过重的“C++ REST SDK”(比如微软那个已弃用的 cpprestsdk),编译麻烦、依赖多、报错信息反人类。
常见错误现象:CURLOPT_URL 没设对导致 CURLE_URL_MALFORMAT;忘了 curl_global_init(CURL_GLOBAL_DEFAULT) 直接 crash;没设 CURLOPT_FOLLOWLOCATION 被 302 重定向卡住。
- 必须在程序启动时调一次
curl_global_init(CURL_GLOBAL_DEFAULT),退出前调curl_global_cleanup() - 每个请求独立用
curl_easy_init(),别复用句柄做并发(除非你手动加锁并设CURLOPT_NOSIGNAL) - 响应体默认不返回,得用
curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, write_callback)+ 自定义回调收数据 - 超时一定要设:
curl_easy_setopt(handle, CURLOPT_TIMEOUT, 10L),否则 DNS 卡死就真卡死了
std::string 接收响应体别用 std::ostringstream
很多示例教你在回调里往 std::ostringstream 写,看似简洁,实则隐藏内存重分配开销和线程安全陷阱——libcurl 回调可能被多次调用,std::ostringstream::str() 返回的是拷贝,不是引用。
正确做法是传一个 std::string* 进去,在回调里直接 ->append(ptr, size):
立即学习“C++免费学习笔记(深入)”;
size_t write_callback(void* ptr, size_t size, size_t nmemb, void* userdata) { std::string* buf = static_cast<std::string*>(userdata); size_t bytes = size * nmemb; buf->append(static_cast<char*>(ptr), bytes); return bytes; }
注意:ptr 不保证以 <p>注意:<code>ptr 不保证以