2014-08-13 1 views
1

Я пытаюсь написать программу C++, которая использует curl-библиотеку для выполнения действия (создание виртуальной машины и т. Д.) На Red Hat Enterprise Virtualizatio (RHEV). Я использую обработчик CURL для выполнения действия post (создание виртуальной машины).Content-Type: application/x-www-form-urlencoded in curl

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

@leemes спасибо это было действительно полезно. – rgaut

ответ

1

Когда вы проходите 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"); 
+0

Да, я понял ... спасибо за быстрый ответ. – rgaut

+0

Ярким последующим вопросом было бы: почему этот забавный API? И правда в том, что он никогда не был хорошим API, но он вроде бы попал туда случайно, и мы застряли с ним, чтобы не сломать старые приложения. –

+0

@ DanielStenberg Полностью согласен. И действительно, обратная совместимость часто является основной причиной для уродливых API-интерфейсов библиотек;) (Лучший пример - PHP!) Я даже не знал, как завиток обрабатывает связанные списки, но я видел, что не имеет смысла только передавать нулевой указатель на функцию C (которая не может изменять ее, так как C не имеет ссылок). Затем я просто прочитал документацию и обнаружил ошибку за 2 секунды, посмотрев пример. ;) – leemes