我正在尝试编写一个c ++程序,该程序使用curl库在Red Hat Enterprise Virtualizatio(RHEV)上执行操作(创建VM等)。我正在使用CURL处理程序来执行后期操作(创建VM)。
CURL *curl;
struct curl_slist *headers=NULL; // init to NULL is important
curl_slist_append(headers, "Accept: application/xml");
curl_slist_append( headers, "Content-Type: application/xml");
/* get a curl handle */
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
但是当我运行这段代码时,我得到了
HTTP Status 415 - Cannot consume content type
Cannot consume content type
The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.
我检查了调试器,即使我将内容类型设置为xml,它也是
0087: Accept: */*
0094: Content-Length: 173
00a9: Content-Type: application/x-www-form-urlencoded
有人可以帮我弄清楚发生了什么吗?非常感谢提前!
答案 0 :(得分:2)
当您将headers
传递给curl_easy_setopt
时,它仍然是一个空指针(即空列表),因此您的标题行不会成为您请求的一部分!
函数curl_slist_append
,在您的情况下是两个调用
curl_slist_append(headers, "Accept: application/xml");
curl_slist_append(headers, "Content-Type: application/xml");
会返回指向新列表的指针,您应该将其分配给列表变量headers
。该函数基本上构造了从尾部到前部的向后链表。 Please consult the documentation of the function, especially have a look at the example code.
因此,在对headers =
的两次调用之前添加curl_slist_append
可以解决问题:
headers = curl_slist_append(headers, "Accept: application/xml");
headers = curl_slist_append(headers, "Content-Type: application/xml");