2

即使我在标题 Content-Lenght 中设置,我也会收到 411 错误。我正在尝试发送 PUT 请求。结构 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);

这是来自服务器的响应:

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
4

2 回答 2

0

您不需要使用文件,也不需要使用自定义请求,而是设置 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 请求之前设置文件大小。

如何在不使用文件指针的情况下在 libcurl 中发送长 PUT 数据?

为此使用 CURLOPT_INFILESIZE 或 CURLOPT_INFILESIZE_LARGE。

于 2015-01-21T00:49:48.150 回答
0

好的,老实说,我找不到您的错误。但是你应该有一个来自curl网站的例子(第一次谷歌点击“curl put c code”):http ://curl.haxx.se/libcurl/c/httpput.html

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

让我感到困惑的是选项CURLOPT_POSTFIELDSCURLOPT_POSTFIELDSIZE. 这是一个放置请求,那么为什么它们甚至在那里?与PUT论点在URL. 至少从 HTTP 的角度来看,主体是不透明的。

于 2013-12-09T10:47:32.870 回答