c++ - 带有 xml 数据的 CUrl PUT

标签 c++ http curl libcurl

我遇到了 curl 的问题,因为我无法发出带有内联 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 header ....没有用。

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

遗憾的是,没有一个奏效,现在我对下一步该尝试什么一无所知。

最佳答案

当使用 CURLOPT_UPLOAD 时,您是将 XML 附加到请求的 header ,而不是它所属的正文。您需要使用 CURLOPT_READDATA(如果您的 XML 不在文件中,则使用 CURLOPT_READFUNCTION)在 curl 要求时提供 XML 数据,还需要使用 CURLOPT_INFILESIZE/CURLOPT_INFILESIZE_LARGE,以便 curl 可以生成适当的“Content-Length” header (不要手动附加该 header )。

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

关于c++ - 带有 xml 数据的 CUrl PUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1706207/

相关文章:

c++ - 从 time_t 转换为 tm 然后再转换回 time_t 时出现问题

c++ - kdevelop 没有指定有效的可执行文件

c++ - C++ 中的 sizeof 字符串数组

Swift http 请求使用 urlSession

php - 为什么 cURL 比 file_get_contents 快?

c++ - 为什么 std::unique_lock 使用类型标签来区分构造函数?

http - 支持搜索时,Post Redirect Get 模式并在基于 RESTful 资源的服务中使用

ruby-on-rails - Rails ActiveResource 检测 HTTP 206 响应代码

curl - Box API 的基本指南对我不起作用

php - 在 PHP CURL 中设置 cookie