Спецификация и документация легковесного, высокопроизводительного REST API сервера на языке C++. Проект разработан с использованием асинхронного веб-фреймворка Crow и демонстрирует механизмы сериализации/десериализации JSON, обеспечения отказоустойчивости веб-узла при некорректных входных потоках данных, а также организацию многопоточной обработки конкурентных HTTP-запросов.
- Многопоточность (Thread Pool): Активация метода
.multithreaded()изолирует обработку входящих соединений в пуле рабочих потоков, распределяя нагрузку по ядрам процессора на системном уровне. - Разделение сущностей чтения/записи (rvalue vs wvalue):
crow::json::rvalueприменяется исключительно для синтаксического анализа и валидации входящего буфера (req.body) в режиме read-only.crow::json::wvalueиспользуется для динамической сборки результирующего JSON-дерева в динамической памяти. По умолчанию контейнер используетstd::unordered_map(сложность поиска и вставки O(1)).
- Предотвращение утечек и отказов (Fail-Safe Handling): Валидация буфера через перегруженный оператор
if (!request_data)пресекает вызовы методов обращения к памяти (.has(),.s(),.i()) на неинициализированном или поврежденном абстрактном синтаксическом девелопере (AST), предотвращая падение рабочего потока (Segment Fault / Unhandled Exception).
Генерация и структурирование комплексного JSON-ответа на стороне сервера.
- HTTP-метод:
GET - Content-Type:
application/json(выставляется фреймворком автоматически при возврате типаwvalue) - Структура ответа (HTTP 200 OK):
{
"success": true,
"status_code": 200,
"message": "Data successfully downloaded",
"rating": 4.8,
"tags": ["c++", "crow", "backend"],
"author": {
"name": "Ivan",
"role": "Developer"
}
}Прием сериализованного JSON-объекта, строгая типизация, инкремент данных и возврат модифицированного объекта.
- HTTP-метод:
POST - Заголовки запроса:
Content-Type: application/json - Спецификация Payload (Входные данные):
{
"username": "string",
"age": "integer"
}- Структура успешного ответа (HTTP 200 OK):
{
"username": "Alex",
"age": 25,
"status": "processed",
"next_year_age": 26
}- HTTP 400 Bad Request — Переданный payload не соответствует синтаксису JSON (Парсер вернул некорректный
rvalue).- Body:
Error: Invalid JSON payload
- Body:
- HTTP 400 Bad Request — В структуре AST отсутствуют обязательные ключи
"username"или"age".- Body:
Error: Username or age fields are missing
- Body:
- Компилятор с полной поддержкой стандарта ISO C++17 или выше (g++-9+, clang-10+, MSVC 2019+).
- Утилита автоматизации сборки CMake версии 3.15 или выше.
- Зависимости: Заголовочные файлы библиотеки Crow и реализации сетевого уровня Asio (или Boost.Asio).
- Инициализация репозитория:
git clone <ссылка_на_ваш_репозиторий>
cd project-directory- Конфигурация дерева сборки посредством CMake и запуск компиляции:
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build . --config Release- Запуск исполняемого бинарного файла:
./serverПо умолчанию сетевой интерфейс инициализируется на порту 18080 для всех доступных адресов (0.0.0.0).
Ниже представлены низкоуровневые тестовые сценарии с использованием утилиты curl для проверки сетевой доступности и логики валидации.
Сценарий №1: Запрос статического JSON-дерева
curl -i http://localhost:18080/get_jsonСценарий №2: Передача валидного объекта (Позитивный тест)
curl -i -X POST http://localhost:18080/post_json \
-H "Content-Type: application/json" \
-d '{"username": "Alex", "age": 25}'Сценарий №3: Передача поврежденного payload (Негативный тест)
curl -i -X POST http://localhost:18080/post_json \
-H "Content-Type: application/json" \
-d '{"broken_json'