Намедни мы выкатили очередную
версию 0.6.6, в которой, среди улучшений и исправлений, следует отметить две новых фичи.
Самая простая из них – это возможность повесить один обработчик сразу для нескольких методов при обращении к одному ресурсу. Например:
// Обработчик будет вызван для методов LOCK и UNLOCK.
router->add_handler(
restinio::router::any_of_methods(
restinio::http_method_lock(), restinio::http_method_unlock()),
"/api/v1/resources/:rid",
[](const auto & req, const auto & params) {...});
// Обработчик будет вызван для всех методов за исключением GET, POST и DELETE.
router->add_handler(
restinio::router::none_of_methods(
restinio::http_method_get(),
restinio::http_method_post(),
restinio::http_method_delete()),
"/api/v1/users/:user",
[](const auto & req, const auto & params) {...});
Но самое важное нововведение – это новый безопасный по типам роутер запросов, который может использоваться вместо привычного express-роутера. При этом новый роутер использует возможности C++ для выявления в compile-time ошибок, которые при использовании express-роутера проявляются только в run-time.
Новый роутер позволяет записать маршрут вот так:
namespace epr = restinio::router::easy_parser_router;
router->http_get(
epr::path_to_params("/api/v1/posts/",
epr::non_negative_decimal_number_p<std::uint64_t>(),
"/revisions/",
epr::non_negative_decimal_number_p<std::int16_t>()),
[](const auto & req, std::uint64_t post_id, std::int16_t rev_id) {...});
тогда как в express-роутере этот же маршрут может описываться, например, так:
router->http_get("/api/v1/posts/:post_id(\d{1,10})/revisions/:rev_id(\d{1,5})",
[](const auto & req, const auto & params) {
const auto post_id = restinio::cast_to<std::uint64_t>(params["post_id"]);
const auto rev_id = restinio::cast_to<std::int16_t>(params["rev_id"]);
});
На Хабре можно найти
статью, которая раскрывает тему нового роутера и некоторых деталей его реализации более подробно.
Взять и попробовать RESTinio можно с
GitHub-а. Так же RESTinio доступен через
Conan и vcpkg.