我遇到了 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_POSTFIELDS
和 CURLOPT_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/