C++ curl + json 进行post请求时的数据传输的问题

流水天骥 2019-01-02 05:11:06
需求:使用C++的libcurl库请求后台服务,数据格式为json
使用到的c++库:libcurl,jsoncpp
问题:jsoncpp序列化的json数据直接传入CURLOPT_POSTFIELDS会失败


// 初始化curl
CURL * curl = curl_easy_init();
// json数据
Json::Value req_data;
req_data["name"] = Json::Value("lyk");
// 设置post数据参数
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, req_data.toStyledString.c_str());


但是,如果是不在curl_easy_setopt函数中执行toStyleString的话,就能够成功


// 初始化curl
CURL * curl = curl_easy_init();
// json数据
Json::Value req_data;
req_data["name"] = Json::Value("lyk");
//将json序列化为字符串
string post_data = req_data.toStyledString();
// 设置post数据参数
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data.c_str());


很奇怪,求助各位!!!
...全文
1927 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdghchj 2019-02-15
  • 打赏
  • 举报
回复
req_data.toStyledString.c_str() => req_data.toStyledString().c_str()
req_data.toStyledString().c_str()
bravery36 2019-02-14
  • 打赏
  • 举报
回复
引用 楼主 流水天骥 的回复:
需求:使用C++的libcurl库请求后台服务,数据格式为json
使用到的c++库:libcurl,jsoncpp
问题:jsoncpp序列化的json数据直接传入CURLOPT_POSTFIELDS会失败


// 初始化curl
CURL * curl = curl_easy_init();
// json数据
Json::Value req_data;
req_data["name"] = Json::Value("lyk");
// 设置post数据参数
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, req_data.toStyledString.c_str());


但是,如果是不在curl_easy_setopt函数中执行toStyleString的话,就能够成功


// 初始化curl
CURL * curl = curl_easy_init();
// json数据
Json::Value req_data;
req_data["name"] = Json::Value("lyk");
//将json序列化为字符串
string post_data = req_data.toStyledString();
// 设置post数据参数
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data.c_str());


很奇怪,求助各位!!!

因为curl_easy_setopt传进去的指针要求使用时有效, 不会内部拷贝内容, 就是curl_easy_perform时还有效, toStyledString的串传完就失效了.
jsxhnooo 2019-02-14
  • 打赏
  • 举报
回复
在curl_easy_setopt外做转换是可以的
流水天骥 2019-01-03
  • 打赏
  • 举报
回复
抱歉,是我打错了,我原本想写的也是这个

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, req_data.toStyledString().c_str());
这里是我的失误,抱歉 但是问题还是我说的那个,如果在curl_easy_setopt中直接进行json的序列化是不行的,只有在外面做才行
@风轻云淡_ 2019-01-03
  • 打赏
  • 举报
回复
之前是我说错了。你的问题在这里
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, req_data.toStyledString.c_str());
丢了一个大括号req_data.toStyledString().c_str()。
@风轻云淡_ 2019-01-03
  • 打赏
  • 举报
回复
那估计是与变量的作用域有关,一定条件下,数据失效了。你可以调试下,看看数据在内存中的变化。
@风轻云淡_ 2019-01-02
  • 打赏
  • 举报
回复
一般情况下,json对象都会有.dump()这个方法,这个是用来转成字符串的。你换成这个试试,估计是你转的字符串有问题。

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧