必须手动设置Content-Type为application/json,并用CURLOPT_POSTFIELDS传原始JSON字符串;需确保字符串生命周期覆盖curl_easy_perform调用全程,用curl_slist_append添加头、curl_slist_free_all释放内存,JSON须为合法UTF-8编码。

curl_easy_setopt设置POST数据和JSON头
libcurl默认不自动识别JSON,必须手动设置Content-Type为application/json,并用 CURLOPT_POSTFIELDS传入原始JSON字符串(不是指针地址)。常见错误是传入std::string.c_str()后,字符串对象提前析构,导致POST内容乱码或空——务必保证JSON字符串生命周期覆盖curl_easy_perform()调用全程。
示例关键步骤:
- 用
curl_easy_init()初始化句柄 - 调用
curl_easy_setopt(curl, CURLOPT_URL, "https://api.example.com") - 设置
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_str.c_str())(json_str是std::string,不能是局部临时对象) - 添加头:
struct curl_slist* headers = nullptr; headers = curl_slist_append(headers, "Content-Type: application/json"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers)
避免内存泄漏:正确清理headers和curl句柄
curl_slist_append()返回的新链表必须用curl_slist_free_all()释放,否则每次请求都泄露内存;curl_easy_cleanup()也必须在最后调用,否则句柄残留。容易被忽略的是:如果在curl_easy_perform()前发生异常(比如JSON构造失败),headers可能已分配但未使用,需在异常路径中也调用curl_slist_free_all()。
典型安全写法:
立即学习“C++免费学习笔记(深入)”;
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
struct curl_slist* headers = nullptr; headers = curl_slist_append(headers, "Content-Type: application/json"); // ... 其他curl_easy_setopt ... auto res = curl_easy_perform(curl); curl_slist_free_all(headers); // 即使curl_easy_perform失败也要free curl_easy_cleanup(curl);
处理中文或特殊字符:JSON字符串必须UTF-8编码
libcurl本身不转码,若JSON里含中文、emoji等,必须确保json_str是合法UTF-8字节流。C++中用std::string直接拼接UTF-8字面量(如"{\"name\":\"张三\"}")可行,但若从文件读取或用户输入获取,需确认源编码并转换。Windows下尤其注意:默认控制台输入可能是GBK,直接塞进JSON会导致服务端解析失败,错误信息常为400 Bad Request或invalid JSON。
验证方法:
- 打印
json_str长度和前10字节十六进制值,确认无0xFF 0xFE等BOM头 - 用
curl -X POST -H "Content-Type: application/json" --data-binary @file.json URL手动测试同一JSON文件是否成功
同步阻塞与超时控制
默认curl_easy_perform()会无限等待响应,生产环境必须设超时。推荐组合使用CURLOPT_TIMEOUT(总超时)和CURLOPT_CONNECTTIMEOUT(连接超时),单位都是秒。例如设curl_easy_setopt(curl, CURLOPT_TIMEOUT, 15L)可防服务端挂起卡死。注意:若POST体很大(如上传文件),还需考虑CURLOPT_LOW_SPEED_LIMIT和CURLOPT_LOW_SPEED_TIME防慢速攻击。
其他实用选项:
-
CURLOPT_SSL_VERIFYPEER设为0L跳过证书校验(仅测试用) -
CURLOPT_ERRORBUFFER配char errbuf[CURL_ERROR_SIZE]捕获具体错误描述 -
CURLOPT_VERBOSE设为1L调试时看完整HTTP交互(上线前关掉)
JSON序列化本身不在libcurl职责内,选nlohmann/json或rapidjson生成字符串再传入,别试图让libcurl“理解”JSON结构。

















