Информация об изменениях

Сообщение Re: RESTinio 0.6.6 от 16.04.2020 12:13

Изменено 16.04.2020 19:18 so5team

Re: RESTinio 0.6.6
Намедни мы выкатили очередную версию 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 (но на данный момент PR для версии 0.6.6 в vcpkg пока еще не приняли).
Re: RESTinio 0.6.6
Намедни мы выкатили очередную версию 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.