根据查询的路由使用不同的请求解析器

时间:2019-02-11 18:12:16

标签: http c++11 boost-asio boost-beast

我正在使用boost beast实现一个小型http服务器。服务器具有两条不同的路由POST / upload / ...,另一条路由是POST / info 。第一个用于上传一些大文件,另一个用于处理json对象。为了保持尽可能高的性能,我尝试使用合适的解析器file_body和string_body / dynamic_body解析每条路由。 我希望可以做类似的事情:

http::async_read_header(
            socket_,
            buffer_,
            request_,
            [self](beast::error_code ec, std::size_t)
            {
                if (!ec)
                    self->request_.body().data();
            });

但似乎不可能。

有什么方法可以根据标题信息使用不同的请求主体?

非常感谢

1 个答案:

答案 0 :(得分:2)

这应该在文档中进行介绍,但操作方法如下:使用类型beast::request_parser<beast::empty_body>首先读取标头,然后根据标头的内容移动从旧结构构造新的解析器一种您想要的身材。示例:

// Deferred body type commitment
request_parser<empty_body> req0;
...
request_parser<string_body> req{std::move(req0)};

您可以在此处阅读有关开关主体类型的完整文档: https://www.boost.org/doc/libs/1_69_0/libs/beast/doc/html/beast/ref/boost__beast__http__parser/parser/overload5.html