Boost.Beast: возможно ли построить HTTP-пакетный запрос? - PullRequest
0 голосов
/ 24 апреля 2020

Я уже некоторое время использую Boost.Beast для отправки HTTP-запросов, и я думаю, что это здорово и отлично работает. Но кто-нибудь знает, возможно ли создать пакетный запрос HTTP с использованием Beast? Я думаю, что-то вроде создания нескольких подзапросов:

boost::beast::http::request<boost::beast::http::string_body> subrequest_1;

subrequest_1.set(boost::beast::http::field::content_type, "application/http");

...

boost::beast::http::request<boost::beast::http::string_body> subrequest_2;

subrequest_2.set(boost::beast::http::field::content_type, "application/http");

...

, а затем как-то сгруппировать их и отправить все в одном запросе.

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

/*

std::vector<boost::beast::http::request<boost::beast::http::string_body>> v;
v.push_back(subrequest_1);

v.push_back(subrequest_2);

boost::beast::http::request<boost::beast::http::string_body> request;

request.method(boost::beast::http::verb::post);
...
request.body() = v;   
*/

Заранее спасибо!

1 Ответ

0 голосов
/ 28 апреля 2020

Ну, этот оказался очень простым. Я просто опубликую свое решение здесь на тот случай, если кто-то еще почувствует себя потерянным, как я сделал пару дней за go.

    // Set up the request with a new content type
    boost::beast::http::request<boost::beast::http::string_body> request;
    request.set(field::content_type, "multipart/mixed; boundary='subrequest_boundary'");

    // A string to hold the entire batch request
    std::string body;

    // Add all messages in e.g. a queue to the string
    while ( messages.size() )
    {
        auto message = messages.front();

        // Add a boundary to separate the messages
        body.append("--subrequest_boundary");
        body.append("Content-Type: application/http\n");
        /*
        And all more headers you need
        */

        // I used the nlohmann library to add json docs
        nlohmann::json payload =    {
                                        {"message",
                                        }
                                    };
        body.append( payload.dump() );
        messages.pop();
    }
    // Add a boundary as wrap up
    body.append("--subrequest_boundary--");

    // Add the batch request to the request
    request.body() = body;
    request.prepare_payload();
...