Ошибка 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.

Другие вопросы по тегам