CppRestSDK Как отправлять составные данные POST

Я пытаюсь POST Multipart данные на сервер, я переключаюсь на CPPRestSDK из CPR, но я не могу найти никакой документации по нему

Из сердечно-легочной реанимации, https://github.com/whoshuu/cpr

Это означает, что я пробовал этот код, но я просто не могу найти документацию по cpprestsdk для составных данных.

    cpr::Multipart multipart_data{};

    for (size_t i = 0; i < files.size(); i++) {
        if (!is_image_or_gif (files[i].filepath)) {
            std::string entire_file = read_entire_file(files[i].filepath);
            std::string custom_filename{ files[i].spoiler ? "SPOILER_" : "" };
            multipart_data.parts.emplace_back(
                "file" + std::to_string(i),
                cpr::Buffer{ entire_file.begin(),
                             entire_file.end(),
                             custom_filename + files[i].filename },
                "application/octet-stream");
        } else {
            multipart_data.parts.emplace_back("file" + std::to_string(i),
                                              cpr::File(files[i].filepath),
                                              "application/octet-stream");
        }
    }

    auto payload_json = nlohmann::json{
        { "content", content },
        { "tts", tts }
    }.dump();
    multipart_data.parts.emplace_back("payload_json", payload_json);

    auto response = cpr::Post(
        cpr::Url{ endpoint("/channels/%/messages", id) },
        cpr::Header{ { "Authorization", format("Bot %", discord::detail::bot_instance->token) },
                     { "Content-Type", "multipart/form-data" },
                     { "User-Agent", "DiscordBot (http://www.github.com/yuhanun/dpp, 0.0.0)" },
                     { "Connection", "keep-alive" } },
        multipart_data);

Где структура file вполне очевидна.

Заголовки, все в порядке, я понял это, мне просто нужна помощь в отправке составных данных :)

Мой ожидаемый результат состоит в том, чтобы сервер ответил "успехом" json, который в данном случае является объектом сообщения отправленного сообщения, однако прямо сейчас я даже не знаю, с чего начать.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
2 202
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поскольку по какой-то причине это получает несколько голосов, я хотел бы ответить на вопрос.

Я решил это давно, вы можете проверить мой репозиторий, чтобы узнать, как именно.

https://github.com/Yuhanun/DPP/blob/master/src/channel.cpp#L108

https://github.com/Yuhanun/DPP/blob/master/src/utils.cpp#L180

Наслаждайтесь решением.

Вот как это можно сделать:

// Form a multipart/form-data scheme 
// 1.Create a boundary ( a random value that you know is unique)
// KabezOf... is something goofie I just wrote, make sure you use 
// something that you know does not exist in  the actual messages.
std::string boundary = "----KabezOfFireDegelDegelGoGoniDaijobo";
// 2.Embed different fields 
std::stringstream bodyContent;
std::map<std::string, std::string> keyValues{ {"key1", "value1"},
                                              {"key2", "value2"},
                                              {"key3", "value3" } };

for (auto& [key, value] : keyValues)
{
    bodyContent << "--" << boundary << "\r\n"
                << "Content-Disposition: form-data; name=\"" << key << "\"\r\n\r\n"
                << value << "\r\n";
}
// 3. if you have any files to send as well, Now is the time
// here we are sending an image file, as you can see, like
// previous block, you can put this into a loop and instead
// of 1 file, have several files.
// reading the image 
std::ifstream inputFile;
inputFile.open(imagePath, std::ios::binary | std::ios::in);
std::ostringstream imgContent;
std::copy(std::istreambuf_iterator<char>(inputFile),
          std::istreambuf_iterator<char>(),
          std::ostreambuf_iterator<char>(imgContent));

auto imageFilename =  std::filesystem::path(imagePath).filename().string();
bodyContent << "--" << boundary<<"\r\n"
            << "Content-Disposition: form-data; name=\"image\"; filename=\"" << imageFilename << "\"\r\n"
            << "Content-Type: " << contentType << "\r\n\r\n"
            << imgContent.str() << "\r\n"
            << "--" << boundary << "--";

web::http::client::http_client client(your_uri);
web::http::http_request requestMessage{ methods::POST };
requestMessage.set_body(bodyContent.str(), "multipart/form-data; boundary = " + boundary);

auto result = client.request(requestMessage);


Другие вопросы по теме