Я хотел бы использовать пион 5.0.6 как небольшой веб-сервер в проекте VS2017 c ++. Для статических маршрутов я могу использовать
add_resource("/my/static/route", <handler>)
Мне также нужны динамические маршруты "/data/:id/info
Как мне это сделать?
Для тех, кому это может понадобиться: я нашел решение добавить динамическую маршрутизацию к пион веб сервер. Это требует умного кода маршрутизатора, который я нашел в hxoht на github, и работает так, что
httpd->add_resource(<url>, <handler);
httpd->set_not_found_handler(<handler>);
и отвечает за отправку динамических маршрутов обработчикам, добавленным выше.pion::http::server
чтобы найти обработчик по имени с httpd->find_request_handler(<url>, <handler>);
в вашем 404-обработчике, вы используете Match::test(<dynamic-route>)
метод обнаружения динамического маршрута — как в следующем фрагменте кода:
void handle_404(http::request_ptr& req, tcp::connection_ptr& con)
{
Route target;
Match dynamic = target.set(req->get_resource());
for (auto& route : dynamic_routes) // Our list of dynamic routes
{
if (dynamic.test(route)) // Does the url match the dynamic route pattern?
{
request_handler_t h;
if (find_request_handler(route, h))
{
auto name = get_param_name(route); // e.g. /a/:b -> "b"value = dynamic.get(name); // Save value in string or map<name, value>
h(req, con); // Call original handler with value set properly
return;
}
}
}
// If no match then return a 404.
http::response_writer_ptr w(http::response_writer::create(con, *req,
boost::bind(&tcp::connection::finish, con)));
http::response& res = w->get_response();
res.set_status_code(http::types::RESPONSE_CODE_NOT_FOUND);
res.set_status_message(http::types::RESPONSE_MESSAGE_NOT_FOUND);
w->send();
}
Для использования пион веб-сервер в многопоточное Кстати, я бы сохранил разобранная стоимость внутри запрос объект, который будет получен из pion::http::request
,
Это будет работать для Windows а также Linux 🙂
Других решений пока нет …