Возможно ли иметь динамические маршруты в пион?

Я хотел бы использовать пион 5.0.6 как небольшой веб-сервер в проекте VS2017 c ++. Для статических маршрутов я могу использовать

add_resource("/my/static/route", <handler>)

Мне также нужны динамические маршруты "/data/:id/info
Как мне это сделать?

-1

Решение

Для тех, кому это может понадобиться: я нашел решение добавить динамическую маршрутизацию к пион веб сервер. Это требует умного кода маршрутизатора, который я нашел в hxoht на github, и работает так, что

  • все маршруты — статические и динамические — задаются с httpd->add_resource(<url>, <handler);
  • обработчик 404 должен быть установлен с 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 🙂

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]