C ++ libcurl PATCH-запрос не работает с преобразованием потока строк через .str.c_str () - PullRequest
1 голос
/ 05 мая 2019

Я отправляю запрос на исправление через библиотеку C ++ libcurl, она работает на 100% без каких-либо проблем, когда я жестко кодирую «полезную нагрузку» в моей программе, однако я хочу, чтобы она была передана, поэтому я использовал stringstream для ее создания.Когда я отправляю его с помощью stringstream, сервер отвечает 400 ошибочным запросом, тогда как, когда я вручную вводю его, программа запускается без ошибок

Вот как это выглядит (и работает), когда я жестко кодирую его в

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "{\"region\":\"us-central\"}");

Вот как я отформатировал его с помощью stringstream (который по какой-то причине не работает

stringstream payload;
payload << "{\"region\":\"";
payload << c_codes[i];
payload << "\"}";

, а в CURLOPT_POSTFIELDS я назвал его payload.str () .c_str ()

Ответы [ 2 ]

1 голос
/ 05 мая 2019

проблема как @ Игорь Тандетник описана, но я просто хочу опубликовать альтернативное решение:

вы можете использовать CURLOPT_COPYPOSTFIELDS вместо CURLOPT_POSTFIELDS, тогда payload.str (). C_str () было бы безопасно, потому что curl сделал бы копию строки для вас и время жизни строки это больше не ваша ответственность, это завиток.

1 голос
/ 05 мая 2019

payload.str() возвращает временно. Затем c_str() получает указатель на последовательность символов, управляемых этим временным. Затем временный уничтожается, и персонажи с ним; указатель становится висящим Затем cURL отправляет любой мусор, который находится в памяти, на которую указывает этот указатель, в память, которая когда-то содержала символьные данные, но больше не.

Вам нужно что-то вроде

std::string data = payload.str();
curl_easy_setopt(..., data.c_str());

, а затем убедитесь, что data постоянно работает, пока обрабатывается запрос.

...