LINUX.ORG.RU

RESTinio: header-only, кросс-платформенная библиотека для встраивания HTTP сервера с удобным express-like маршрутизатором

 , ,


5

6

RESTinio - это header-only, кросс-платформенный инструмент для встраивания HTTP сервера с удобным express-like маршрутизатором и вебсокетами. Главная задачей RESTinio является упрощение асинхронной обработки запросов. Чтобы, грубо говоря, обработчик спокойно мог потратить 15 секунд на формирование ответа, но это бы не влияло на параллельные запросы.

RESTinio с самого начала создавался так, чтобы его с одной стороны было удобно использовать, а с другой, чтобы он был производительным и масштабируемым. RESTinio с самого начала написан с использованием C++14.

Вот как будет выглядеть простейший http-сервер, который отвечает на все запросы hello-world сообщением:

#include <restinio/all.hpp>

int main()
{
  restinio::run(
    restinio::on_this_thread()
      .port(8080)
      .address("localhost")
      .request_handler([](auto req) {
        return req->create_response().set_body("Hello, World!").done();
      }));

  return 0;
}

В данном примере обработчик запросов предельно прост, но, конечно, RESTinio дает доступ ко всем параметрам запроса, что позволяет делать более сложные обработчики.

Возможности:

  • Асинхронная обработка запросов. В случаях, когда данные для ответа на запрос не могут быть получены сразу (или почти сразу), то можно сохранить хэндл запроса для дальнейшей обработки (например, в другом контексте исполнения) и вернуться к этому запросу, когда все данные будут готовы.
  • HTTP pipelining. Хорошо работает в связке с асинхронной обработкой запросов.
  • Контроль за таймаутами. RESTinio может помочь в обработке “плохих” соединений, например из которых приходит «GET /», а затем они просто висят.
  • Построители ответов. Например, если нужно тело chunked-encoding, то в RESTinio есть и такой билдер.
  • Express-like маршрутизатор. Нужно создать нетривиальное REST API со множеством маршрутов, в которых к тому же заключены параметры? Просто возьмите RESTinio с express-like маршрутизатором, который создан по мотивам известного js-фрэймворка.
  • Поддержка TLS (HTTPS).
  • Базовая поддержка websocket. При помощи restinio::websocket::basic::upgrade() можно начать websocket сессию используя соединение, в котором был получен исходный upgrade-запрос.
  • Может быть запущен на стороннем asio::io_context. RESTinio отделен от контекста исполнения, что, например, позволяет запустить 2 сервера используя один asio::io_context или встраивать RESTinio в существующее приложение построенное на ASIO и для этого не потребуется отдельный io_context.
  • Некоторые настройки для оптимизации. Можно задать дополнительные опции для акцептора и сокета. Если RESTinio работает на пуле, то можно задать чтобы соединения принимались параллельно и/или создание внутренних объектов для работы с соединением создавались отдельно, это позволит быстрее принимать новые соединения.

RESTinio для своей работы использует standalone версию ASIO, а также ряд других хорошо известных open-source библиотек (nodejs/http-parser и fmtlib), а также catch2 для тестов.

RESTinio-0.4 можно рассматривать как стабильную бета версию.

Репозиторий проекта: https://bitbucket.org/sobjectizerteam/restinio-0.4

Документация: https://stiffstream.com/en/docs/restinio/0.4

Взгляд со стороны, пожелания, предложения и конструктивная критика приветствуются!