Согласно сообщению в блоге RapidAPI, наиболее популярными языками/фреймворками, используемыми для создания API, являются PHP, NodeJS и Python (с довольно приличным отрывом). Нечасто для этой цели используются такие языки, как C++, поскольку это немного выходит за рамки их компетенции. Я испытал это на себе при создании веб-интерфейса для запуска симуляции C++, которую я создал ранее, которая была повторной реализацией алгоритма торговли колесом. В этом случае я использовал NodeJS для создания API, который можно было бы вызывать из веб-интерфейса, который затем использовал библиотеку для выполнения кода C++ через терминальные вызовы. Это было довольно неэффективно и более подвержено ошибкам, чем обработка всего на C++. Поэтому я решил выяснить, что нужно для того, чтобы просто обслуживать конечные точки API с помощью C++, и обнаружил, что Pistache.io — очень простой и эффективный способ сделать это. В этом посте я покажу, как настроить API на C++, создав очень простой запрос GET и очень простой запрос POST с помощью Pistache.

Прежде чем мы углубимся в это, я упомяну пару вариантов использования, поскольку, если вы планируете создать веб-приложение, вероятно, лучше всего придерживаться современных веб-технологий (NodeJS, PHP, Python и т. д.) для API. Я вижу две важные причины для использования C++/Pistache: 1) у вас уже есть приложение на C++, которое вы хотели бы запустить через веб-интерфейс, и 2) у вас есть приложение на C++, которое вы хотели бы смешать с другими приложениями через Docker или какая-то другая форма контейнеризации. В любом случае настройка легкодоступных конечных точек API, вероятно, является лучшим решением.

Фисташка

Согласно их веб-сайту, Pistache — это элегантный фреймворк C++ REST. Платформа очень проста в использовании, предлагая множество функций, включая многопоточные HTTP-серверы, HTTP-маршрутизатор для простой отправки запросов функции C++ и асинхронный HTTP-клиент для запроса API. Библиотеку легко установить на большинстве систем (я использую Debian 10 на своем сервере и другие системы на основе Debian в других местах), поскольку она имеет официальный PPA. Инструкции по установке можно найти в их кратком руководстве.

Хотя я нашел фреймворк простым в использовании, для начала потребовалось немного усилий. Документация проекта хороша, но оставляет желать лучшего. Я обнаружил, что чтение кода для примеров на GitHub чрезвычайно полезно и дало большую часть информации для этого короткого поста, особенно пример rest_server.cc. После установки Pistache библиотеку можно включить в g++ с помощью флага -lpistache. Ниже приведен базовый Makefile для создания исполняемого файла для сервера с кодом в файле с именем main.cpp.

Этот Makefile иллюстрирует один потенциальный недостаток Pistache, а именно то, что требуется C++17. Я думаю, что в большинстве случаев это не должно быть проблемой, поскольку стандарту уже 5 лет, но это может быть сдерживающим фактором для вас.

Настраивать

После установки и включения Pistache в ваш проект C++ потребуется включить несколько заголовков, чтобы использовать фреймворк.

Я также использую RapidJSON для разбора тела запроса для POST-запросов, поэтому его также необходимо включить. Ранее я писал об использовании библиотеки RapidJSON для работы с JSON в C++, любой заинтересованный читатель должен ознакомиться с этим постом.

Далее, чтобы немного упростить жизнь, мы будем использовать пространство имен Pistache.

Наконец, нам нужно определить несколько переменных в функции main, которые используются для запуска сервера. Вместо того, чтобы подробно описывать их, я добавил в код несколько пояснительных комментариев.

ПОЛУЧИТЬ запросы

Нет параметров

Для начала мы определим очень простую конечную точку запроса GET, которая не принимает никаких параметров и отправляет ответ. Самое простое, что я мог придумать, это повторить «мир!» в конечной точке «привет». Функция обратного вызова выглядит так

Довольно просто! Обратите внимание, что все обратные вызовы для REST API, созданные с помощью Pistache, имеют одну и ту же подпись с другим именем функции. Теперь мы добавим этот маршрут в маршрутизатор.

Выше я добавил маршрут «/hello» к ранее определенному маршрутизатору. Я включил сюда всю основную функцию, чтобы показать, как все это вписывается, но в дальнейшем я буду включать меньше кода, чтобы подчеркнуть изменения, которые фактически вносятся (чтобы они не потерялись в окружающем коде). Теперь, скомпилировав и запустив его через файл Makefile выше и ./server (при использовании системы Linux и Make as I), должна открыться конечная точка, доступная по адресу

http://локальный:9900/привет

Переход по этому URL-адресу в веб-браузере (или отправка запроса GET с помощью других средств, например, Postman) вернет ответ ниже

мир!

Это не может быть намного проще.

С (необязательно) параметрами

Далее мы рассмотрим выполнение запросов GET, но теперь с параметрами URL. Параметры в запросах GET передаются через URL. В Pistache они могут быть помечены как необязательные или обязательные. Для демонстрации создается конечная точка, которая принимает один (необязательный) параметр и просто возвращает его пользователю. Эта конечная точка называется «/echo_get», а параметр называется «text», что делает конечную точку «/echo_get/:text?» . Обратите внимание, что «?» после имени параметра («:текст») указывает на то, что этот параметр является необязательным. Если это было удалено, параметр должен быть частью URL-адреса, иначе будет ошибка, что маршрут не существует. Вот обратный вызов для «/echo_get»

Этот новый маршрут необходимо будет добавить к маршрутизатору.

Есть два способа отправить этот запрос, а именно с параметром и без него. Последний будет выглядеть так (убедитесь, что ваш сервер работает)

http://локальный:9900/echo_get

который возвращает ответ

Параметр не указан.

как и ожидалось. Первый (с параметром) может выглядеть примерно так

http://localhost:9900/echo_get/привет!

который повторяет текст

привет!

Несколько параметров могут обрабатываться аналогичным и интуитивно понятным способом.

POST-запросы

Если вы использовали свой браузер для отправки запросов GET, то для перехода к запросам POST потребуется другой метод. Это связано с тем, как параметры обрабатываются в запросе, что делает его более безопасным и идеальным для работы с конфиденциальными данными. Я использую Postman для тестирования своих конечных точек, но вы можете использовать любое другое программное обеспечение, позволяющее отправлять запросы (также очень легко тестировать конечные точки в Python с помощью библиотеки requests).

Для запуска callback определяется

Этот обратный вызов проверит текстовый параметр и, если он доступен, отобразит его обратно пользователю. Если он недоступен, ответом будет сообщение о том, сколько будет. Обратите внимание, что здесь мы используем RapidJSON для обработки тела запроса (в формате JSON): У меня есть еще один пост об использовании этой библиотеки C++ для работы с JSON, который может быть полезен, если вы не знакомы с этим обработка. (Для тех, кто интересуется, почему я использую RapidJSON, а не JsonCpp, я использовал оба варианта в некоторых работах по контракту в начале 2021 года, и при анализе данных OHLC за ~10 лет JsonCpp занял ~20 минут и всего несколько секунд с RapidJSON, при этом , у обоих есть свои плюсы и минусы.)

Теперь маршрут нужно добавить в роутер

При работающем сервере запросы могут быть отправлены на URL

http://локальный:9900/эхо

с параметром «текст» или без него в JSON, отправляемом на сервер. Ниже приведен снимок экрана Postman, демонстрирующий, как передаются параметры.

Обратите внимание: я использую этот API на своем сервере с сетевым именем navier, если он работает на вашем локальном компьютере, запрос должен использовать localhost, а не навье.

Отправка этого запроса возвращает приведенный ниже ответ, как и ожидалось:

Привет, мир!

Опять же, эту логику можно расширить для обработки нескольких параметров. Моя цель состояла в том, чтобы показать большую часть функций, которые (более или менее) потребуются при реализации собственного API.

Заключение

В этом посте я обсудил, как настроить некоторые базовые конечные точки API и обслуживать их на C++ через инфраструктуру Pistache. Фреймворк прост в использовании, и многие программисты на C++ должны открыть множество дверей, сделав свои приложения более доступными для аудитории. Ниже приведен полный код этого API, не стесняйтесь использовать и изменять его по своему усмотрению.

Полный код