内容类型:应用程序/ x-www-form-urlencoded in curl

时间:2014-08-13 21:34:52

标签: c++ curl libcurl

我正在尝试编写一个c ++程序,该程序使用curl库在Re​​d 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

有人可以帮我弄清楚发生了什么吗?非常感谢提前!

1 个答案:

答案 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");