как читать поток в буфер Concurrency::streams::streambuf‹uint8_t›; на С++

Я работаю с cpprestsdk в проекте в качестве сервера. Мне нужно прочитать Тело запроса на размещение.

в документации используется message.body().read_to_end(buffer);

Я пробовал это без успеха.

void MyProject::handle_post(http_request message)
{
        Concurrency::streams::streambuf<uint8_t> buffer;
        buffer.alloc(10); // Crashes Here
        message.body().read_to_end(buffer);
        ...

Что я делаю не так? Как я могу выделить и прочитать данные из этого буфера?


person Daniel Santos    schedule 18.12.2017    source источник
comment
Просто удалите вызов alloc +, если вы все еще получаете сообщение об ошибке, добавьте дополнительную информацию об этой ошибке.   -  person huysentruitw    schedule 18.12.2017


Ответы (2)


Столкнувшись с той же проблемой, я решил не использовать read_to_end, потому что каждое найденное решение вызывает исключение. Оказывается, это не самый простой способ извлечь тело.

Чтобы извлечь данные из тела http_message (независимо от типа MIME), я использую следующее

const auto data = message.content_ready().get().extract_vector().get();
const utility::string_t body = { data.begin(), data.end() };

Другой вариант, который я могу предложить, если вам нужен std::string во всех случаях, это

const auto body = response.content_ready().get().extract_utf8string(true).get();

что также является очень удобным способом доступа к данным.

person Chris Mc    schedule 21.06.2019

Вы можете использовать это для чтения тела в файл:

    auto fileStream = concurrency::streams::fstream::open_ostream(utility::conversions::to_string_t(filepath), std::ios::out | std::ios::binary).get();

    // Get body from request
    auto bodyStream = request.body();

    // Write input from request body directly to output filestream
    bodyStream.read_to_end(fileStream.streambuf()).wait();
    fileStream.close().wait();
person Maarten    schedule 11.12.2020