CUrl PUT与xml数据

时间:2009-11-10 07:39:04

标签: c++ http curl libcurl

我正面临卷曲问题,因为我无法使用内联XML数据发出PUT请求,我不知道它是如何完成的,但我想用不同的技术进行一些操作。首先,我尝试使用CURLOPT_UPLOAD作为PUT的默认CURL选项,并尝试手动附加xml数据:

    typedef map<string, string> headers_t;
    std::string strCommand = <XMLCOMMAND>

PUTRequest(param1, param2, ...)
    {
...
    headers_t headers;
    int nLen = strCommand.length();
    stringstream issLen;
        issLen << nLen;
        issLen >> strln;
    curl_easy_setopt(curl, CURLOPT_UPLOAD, true); // HTTP PUT
    headers.append("Content-Length: "+ strln); //
    headers.append(strCommand);
...
    }

然后我尝试了相同的方法,但使用CURLOPT_POSTFIELDSCURLOPT_POSTFIELDSIZE而不是手动将命令附加到HTTP标头....不起作用。

然后我尝试使用CURLOPT_CUSTOMREQUEST选项自定义PUT请求并将参数设置为PUT,并手动附加命令并使用POSTFIELDS方法。

可悲的是没有人工作,现在我对下一步尝试的事情一无所知。

1 个答案:

答案 0 :(得分:3)

使用CURLOPT_UPLOAD时,您将XML附加到请求的标题,而不是它所属的主体。您需要使用CURLOPT_READDATA(如果您的XML不在文件中时使用CURLOPT_READFUNCTION)在curl请求时提供XML数据,并且还使用CURLOPT_INFILESIZE / CURLOPT_INFILESIZE_LARGE,因此curl可以生成正确的“Content-Length”标头(不要手动附加该标题)。

如果使用CURLOPT_POST,则使用CURLOPT_POSTFIELDS和CURL_POSTFIELDSIZE / CURLOPT_POSTFIELDSIZE_LARGE来提供实际的XML数据,但是您还必须使用CURLOPT_HTTPHEADER来覆盖默认的“Content-Type”标题,以便您可以将其更改为默认值'application / x-www-form-urlencoded'改为'text / xml'。