0

我遇到了 curl 的问题,因为我无法使用内联 XML 数据发出 PUT 请求,我不确定它是如何完成的,但我已经使用不同的技术进行了几次处理。首先,我尝试使用CURLOPT_UPLOADPUT 的默认 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_POSTFIELDSandCURLOPT_POSTFIELDSIZE而不是手动将命令附加到 HTTP 标头.... 不起作用。

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

可悲的是,没有一个有效,现在我对接下来要尝试什么一无所知。

4

1 回答 1

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'。

于 2009-11-11T20:46:15.637 回答