CURL PUT с данными XML - PullRequest
       13

CURL PUT с данными XML

0 голосов
/ 10 ноября 2009

У меня проблема с curl, так как я не могу выполнить запрос PUT со встроенными XML-данными, я не уверен, как это делается, но я сделал несколько попыток использовать разные методы. Сначала я попытался использовать CURLOPT_UPLOAD в качестве параметра CURL по умолчанию для PUT и попытался добавить данные 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 .... не сработало.

Затем я попытался настроить запрос PUT с помощью параметра CURLOPT_CUSTOMREQUEST и установить для параметра значение PUT, а также вручную добавить команду и использовать метод POSTFIELDS.

К сожалению, никто не работал, и теперь я не знаю, что делать дальше.

1 Ответ

3 голосов
/ 11 ноября 2009

При использовании CURLOPT_UPLOAD вы добавляете XML к заголовкам запроса, а не к телу, которому он принадлежит. Вам нужно использовать CURLOPT_READDATA (с CURLOPT_READFUNCTION, если ваш XML отсутствует в файле), чтобы предоставлять данные XML, когда curl запрашивает их, а также использовать CURLOPT_INFILESIZE / CURLOPT_INFILESIZE_LARGE, чтобы curl мог генерировать правильный заголовок «Content-Length», который не может ( добавить этот заголовок вручную).

Если вы используете CURLOPT_POST, то используйте CURLOPT_POSTFIELDS и CURL_POSTFIELDSIZE / CURLOPT_POSTFIELDSIZE_LARGE, чтобы предоставить фактические данные XML, но затем вам также нужно использовать CURLOPT_HTTPHEADER, чтобы переопределить значение по умолчанию для значения «Content-type», поэтому вы можете изменить значение по умолчанию для значения «Content-Type» по умолчанию, так что вы можете изменить значение по умолчанию из «Content-Type»; Вместо 'application / x-www-form-urlencoded' вместо 'text / xml'.

...