Ошибка 411 длина требуется C++, запрос PUT libcurl
Несмотря на то, что я установил в заголовке Content-Lenght, я получаю 411 ошибку. Я пытаюсь отправить запрос PUT. struct curl_slist *headers = NULL;
curl = curl_easy_init();
std::string paramiters =
"<data_file><archive>false</archive><data_type_id>0a7a184a-dcc6-452a-bcd3-52dbd2a83ea2</data_type_id><data_file_name>backwardstep.stt</data_file_name><description>connectionfile</description><job_id>264cf297-3bc7-42e1-8edc-5e2948ee62b6</job_id></data_file>";
if (curl) {
headers = curl_slist_append(headers, "Accept: */*");
headers = curl_slist_append(headers, "Content-Length: 123");
headers = curl_slist_append(headers, "Content-Type: application/xml");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_VERBOSE, true);
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_easy_setopt(curl, CURLOPT_URL,
"..url/data_files/new/link_upload.xml");
curl_easy_setopt(curl, CURLOPT_USERPWD, "kolundzija@example.ch:PASS");
curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, paramiters.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE,
strlen(paramiters.c_str()));
curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L);
res = curl_easy_perform(curl);
и это ответ от SERVER:
Host: cloud...
Transfer-Encoding: chunked
Accept: */*
Content-Length: 123
Content-Type: application/xml
Expect: 100-continue
* The requested URL returned error: 411 Length Required
* Closing connection #0
2 ответа
Хорошо, я, честно говоря, не могу найти вашу ошибку. Но у вас должен быть пример с веб-сайта curl (сначала в Google прозвучало "curl put c code"): http://curl.haxx.se/libcurl/c/httpput.html
Возможно, смешивание простого и продвинутого интерфейса сбивает с толку curl.
Что меня смущает, так это варианты CURLOPT_POSTFIELDS
а также CURLOPT_POSTFIELDSIZE
, Это положительный запрос, так почему они вообще там? С PUT
аргументы в URL
, Тело непрозрачно, по крайней мере, с точки зрения HTTP.
Вам НЕ нужно использовать файл и НЕ использовать пользовательские запросы, INstead устанавливает параметры UPLOAD и PUT, как указано в документации здесь:
http://curl.haxx.se/libcurl/c/httpput.html
В отличие от приведенного выше примера, где они используют файл в качестве вашей структуры данных, вы можете ИСПОЛЬЗОВАТЬ НИЧЕГО для хранения ваших данных. Все дело в использовании функции обратного вызова с этим параметром: CURLOPT_READFUNCTION Различие состоит в том, как вы устанавливаете свою функцию обратного вызова, которая должна только выполнять две вещи: 1.-измерить размер вашей полезной нагрузки (ваших данных) в байтах 2.-скопировать данные в адрес памяти, который curl передает обратному вызову (это первый аргумент вашей функции обратного вызова, FIRST void указатель) в этом определении)
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
Это аргумент ptr.
Используйте memcpy для копирования данных.
Посмотрите на эту ссылку. Я столкнулся с той же проблемой, что и вы, и смог решить ее, используя этот подход, но вам нужно помнить одну вещь: вам также необходимо установить размер файла перед отправкой запроса curl.
Как отправить длинные данные PUT в libcurl без использования файловых указателей?
Для этого используйте CURLOPT_INFILESIZE или CURLOPT_INFILESIZE_LARGE.