C++ Libcurl获取响应”的;415不支持的媒体类型;但是使用Curl.exe可以很好地工作
我不确定我做错了什么,但是在curl中使用命令时没有发生错误。即使声明了C++ Libcurl获取响应”的;415不支持的媒体类型;但是使用Curl.exe可以很好地工作,c++,curl,libcurl,C++,Curl,Libcurl,我不确定我做错了什么,但是在curl中使用命令时没有发生错误。即使声明了curl\u easy\u setopt(curl,CURLOPT\u HEADER,“Content-type:application/json”) 这是我的密码: curl_easy_setopt(curl, CURLOPT_URL, "https://zone1:50000/user/login"); curl_easy_setopt(curl, CURLOPT_POST, 1);
curl\u easy\u setopt(curl,CURLOPT\u HEADER,“Content-type:application/json”)代码>
这是我的密码:
curl_easy_setopt(curl, CURLOPT_URL, "https://zone1:50000/user/login");
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");
const std::string raw_json = R"json({ "username": "admin", "password": "password123"})json";
Json::CharReaderBuilder builder {};
auto reader = std::unique_ptr<Json::CharReader>( builder.newCharReader() );
Json::Value root {};
std::string errors {};
const auto is_parsed = reader->parse( raw_json.c_str(),
raw_json.c_str() + raw_json.length(),
&root,
&errors );
if ( !is_parsed )
{
qDebug() << "ERROR: Could not parse! " << errors.c_str();
}
Json::FastWriter fastWriter;
std::string output = fastWriter.write(root);
qDebug() << "Parsed JSON:" << output.c_str();
curl_easy_setopt(curl, CURLOPT_POSTFIELDS,output.c_str());
curl_easy_setopt(curl, CURLOPT_HEADER, "Origin: https://zone1:50000");
curl_easy_setopt(curl, CURLOPT_ENCODING, "Accept-Encoding: gzip, deflate, br");
curl_easy_setopt(curl, CURLOPT_HEADER, "Accept-Language: en-US,en;q=0.9");
curl_easy_setopt(curl, CURLOPT_HEADER, "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36");
curl_easy_setopt(curl, CURLOPT_HEADER, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_HEADER, "Accept: application/json, text/plain, */*");
curl_easy_setopt(curl, CURLOPT_HEADER, "Referer: https://zone1:50000/login");
curl_easy_setopt(curl, CURLOPT_HEADER, "Connection: keep-alive");
res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, cookies);
res = curl_easy_perform(curl);
我收到的答复是:
- 找到主机区域1的捆绑包:0x11ce588[串行]
- 不能多路复用,即使我们想
- 重新使用现有连接!(#0)与主机分区1
- 连接到1区(10.1.233.120)端口50000(#0)
*>POST/user/login HTTP/1.1
主持人:1:50000
接受:/
接受编码:接受编码:gzip,deflate,br
内容长度:44
内容类型:application/x-www-form-urlencoded
- 上传已完全发送:44个字节中的44个
- 将捆绑包标记为不支持多用途
您设置的标题都错了,CURLOPT_HTTPHEADER的标题列表不是char*,它是一种特殊的列表,请尝试
struct curl\u slist*list=NULL;
list=curl\u slist\u append(list,“接受语言:en-US,en;q=0.9”);
list=curl\u slist\u append(list,“内容类型:application/json”);
list=curl\u slist\u append(list,“Accept:application/json,text/plain,*/*”;
列表=curl\u slist\u append(列表,“引用者:https://zone1:50000/login");
list=curl\u slist\u append(列表,“连接:保持活动”);
curl_easy_setopt(curl,CURLOPT_标题,列表);
(...)
卷曲列表(列表);
(...)
另外,不要使用CURLOPT_HEADER设置用户代理
,因为如果将来您执行多个请求,或者如果使用CURLOPT_FOLLOWLOCATION,curl将“忘记”用户代理,而使用CURLOPT_USERAGENT,因此curl不会忘记它:
curl_easy_setopt(curl,CURLOPT_USERAGENT,“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/75.0.3770.100 Safari/537.36”);
我通过添加
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
char* jsonObj = "{ \"username\" : \"admin\" , \"password\" : \"password123\" }";
curl_easy_setopt(curl, CURLOPT_POSTFIELDS,jsonObj );
感谢@hanshenrik指出为标题创建列表。仍然有相同的结果
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
char* jsonObj = "{ \"username\" : \"admin\" , \"password\" : \"password123\" }";
curl_easy_setopt(curl, CURLOPT_POSTFIELDS,jsonObj );