C++ 错误411所需长度c++;,libcurl PUT请求

C++ 错误411所需长度c++;,libcurl PUT请求,c++,libcurl,put,http-status-code-411,C++,Libcurl,Put,Http Status Code 411,即使我设置了标题内容长度,我还是得到了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_ty

即使我设置了标题内容长度,我还是得到了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);

好吧,我真的找不到你的错误。但是你应该有一个来自curl网站的例子(第一次谷歌点击“curl-put-c-code”):

也许简单和高级界面的混合会让curl感到困惑


让我困惑的是选项
CURLOPT\u POSTFIELDS
CURLOPT\u POSTFIELDSIZE
。这是一个put请求,为什么他们会在那里?使用
PUT
时,参数位于
URL
中。正文是不透明的,至少从HTTP的角度来看是这样。

您不需要使用文件,也不需要使用自定义请求,而是按照此处文档中的指定设置上载和放置选项:

与上面使用文件作为数据结构的示例不同,您可以使用任何东西来保存数据。这一切都取决于使用带有此选项的回调函数: CURLOPT_函数 不同之处在于如何设置回调函数,回调函数只需做两件事: 1.-以字节为单位测量有效负载(数据)的大小 2.-将数据复制到curl传递给回调函数的内存地址(这是回调函数的第一个参数,此定义中的第一个空指针)

这就是ptr的论点

使用memcpy复制数据

看看这个链接。我遇到了与您相同的问题,并且能够使用这种方法解决它,您需要记住的一点是,您还需要在发送curl请求之前设置文件大小


使用CULLOPT_infiresize或CULLOPT_infiresize_LARGE进行此操作。

内容长度:123
-123的实际大小正确吗?您好,我找不到任何使用PUT发送数据的示例(不仅仅是文件字符串)。然后有人在这里写道,您可以使用CURLOPT_CUSTOMREQUEST“PUT”+postfields方法。这就是我尝试这样做的原因。在控制台中,它使用CURL工作,所以我猜它的问题在于它没有发送主体。如果你知道如何用PUT发送sting,请不要急着告诉:)唯一有效的方法是将sting保存在文件中,然后按照libcurl示例执行。
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
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)