REST API, медиа-контент и выбор фреймворка
Лабораторная работа 8. REST API, FOSRestBundle, сериализация и OpenAPI
Аудиторная работа: 3 ак. ч.
Самостоятельная работа: 4 ак. ч.
Цель: создать документированный REST API BizFlow.
FOSRestBundle предназначен для разработки RESTful API в Symfony и поддерживает View layer, negotiation, сериализацию и обработку ошибок; актуальная ветка поддерживает современные версии Symfony. [22] NelmioApiDocBundle генерирует OpenAPI-документацию и поддерживает Symfony routes, PHP attributes, FOSRestBundle и Symfony Serializer. [23]
Задание
-
Установите:
composer require friendsofsymfony/rest-bundle
composer require nelmio/api-doc-bundle
-
Убедитесь, что Symfony Serializer включен.
-
Настройте JSON как основной формат API.
-
Все API-маршруты разместите под:
/api
-
Реализуйте:
GET /api/customers
GET /api/customers/{id}
POST /api/customers
PATCH /api/customers/{id}
GET /api/orders
GET /api/orders/{id}
POST /api/orders
PATCH /api/orders/{id}/status
GET /api/products
GET /api/products/{id}
-
Формат ответа списка:
{
"data": [],
"meta": {
"page": 1,
"limit": 20,
"total": 0
}
}
-
Реализуйте query parameters:
page
limit
search
status
sort
-
Ограничьте:
1 <= limit <= 100
-
Создайте DTO для входных данных API.
-
Не передавайте JSON непосредственно в Entity без контроля полей.
-
Используйте Validator.
-
Настройте serialization groups.
-
Скрывайте:
password
внутренние технические поля
секреты
-
Используйте HTTP-коды:
200 OK
201 Created
204 No Content
400 Bad Request
403 Forbidden
404 Not Found
409 Conflict
422 Unprocessable Content
-
После POST /api/orders возвращайте идентификатор созданного ресурса.
-
Реализуйте единый JSON-формат ошибок:
{
"type": "...",
"title": "...",
"status": 422,
"detail": "...",
"errors": []
}
-
Не возвращайте stack trace в production-ответах.
-
Используйте FOSRestBundle минимум для одного из механизмов:
View;
format handling;
exception handling;
response serialization.
-
Настройте NelmioApiDocBundle.
-
Для каждого endpoint документируйте:
summary;
parameters;
requestBody;
response;
HTTP codes;
security.
-
Добавьте OpenAPI-схемы:
Customer
CreateCustomerRequest
SalesOrder
CreateOrderRequest
ApiError
-
Откройте Swagger/OpenAPI UI.
-
Проверьте все методы вручную.
-
Напишите API functional tests.
Symfony BrowserKit предоставляет jsonRequest() для выполнения JSON-запросов в функциональных тестах. [24]
-
Минимальное количество API-тестов:
15
-
Обязательные негативные тесты:
несуществующий ID;
невалидный email;
пустое имя;
неизвестный status;
limit=100000;
недопустимое изменение статуса;
доступ без требуемой роли;
duplicate email.
Обязательный запрос ИИ API-архитектору
Ты — REST API architect.
Проанализируй BizFlow и спроектируй API для:
customers;
products;
orders.
Требования:
RESTful URLs;
корректные HTTP methods;
корректные status codes;
pagination;
filtering;
DTO;
validation;
serialization groups;
единый error format;
OpenAPI.
Сначала создай контракт API в виде таблицы endpoint/method/request/response/status.
Код пока не пиши.
Обязательный запрос ИИ adversarial tester
Ты — adversarial API tester.
Проанализируй /api.
Создай негативные тесты:
пустой JSON;
сломанный JSON;
лишние поля;
wrong content-type;
несуществующие ID;
duplicate values;
очень большие limit;
отрицательная page;
некорректный enum;
неразрешенные операции;
нарушение последовательности статусов.
После этого запусти тесты и составь список найденных ошибок.
Самопроверка
php bin/console debug:router
php bin/console debug:config fos_rest
php bin/console debug:config nelmio_api_doc
php bin/phpunit
Критерии приемки
[ ] установлен FOSRestBundle
[ ] установлен NelmioApiDocBundle
[ ] API возвращает JSON
[ ] реализованы DTO
[ ] работает validation
[ ] используются serialization groups
[ ] реализованы корректные HTTP status codes
[ ] создан единый error format
[ ] работает OpenAPI
[ ] Swagger UI открывается
[ ] имеется минимум 15 API tests
[ ] имеется AI log
NelmioApiDocBundle поддерживает OpenAPI и может строить описание моделей с учетом Symfony Serializer и Validator; современные версии используют PHP attributes. [23]
