我在C中使用libcurl定义了带有JSON请求主体的PUT请求。
这就是我的做法:
sprintf(jsonObj, "\"name\" : \"%s\", \"age\" : \"%s\"", name, age); struct curl_slist *headers = NULL; curl_slist_append(headers, "Accept: application/json"); curl_slist_append(headers, "Content-Type: application/json"); curl_slist_append(headers, "charset: utf-8"); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonObj); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcrp/0.1"); res = curl_easy_perform(curl);
请求主体将这样到达:
{ '"name" : "Pedro", "age" : "22"' }
随着{ '在开始和' }结尾。
{ '
' }
- - 更多信息 - - -
如果我声明此代码
char* jsonObj = "{ \"name\" : \"Pedro\" , \"age\" : \"22\" }"; struct curl_slist *headers = NULL; curl_slist_append(headers, "Accept: application/json"); curl_slist_append(headers, "Content-Type: application/json"); curl_slist_append(headers, "charset: utf-8"); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonObj); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcrp/0.1"); res = curl_easy_perform(curl);
服务器将其作为请求正文接收:
{ '{ "name" : "Pedro" , "age" : "22" }': '' }
我的问题是:
libCurl是否自动对Json请求进行预格式化/编码?
顺便说一句,libCurl是否具有某种编码JSON对象的方式?
非常感谢!
问题可能出在标题上。在配置curl_slist标头时,我认为您应该将curl_slist_append的输出分配回标头:
struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Accept: application/json"); headers = curl_slist_append(headers, "Content-Type: application/json"); headers = curl_slist_append(headers, "charset: utf-8");