API Style Guide — внутренний стандарт проекта, файл docs/API_STYLE_GUIDE.md.
примеры правил
URI MUST use nouns.
GET MUST NOT change business state.
Public operations MUST define operationId.
Errors SHOULD use application/problem+json.
Collections MUST support pagination
when their size is unbounded.
Если кто-то удалит contact из app/main.py, тест упадёт с указанием строки. Правило проверяется автоматически при каждом запуске pytest.
82Каждый endpoint обязан иметь operationId
Тест проходит по всем операциям схемы и проверяет правило для каждой.
tests/test_contract.py
def test_every_operation_has_operation_id():
schema = app.openapi()
for path, method, operation in operations(schema):
assert operation.get("operationId"), (
f"{method.upper()} {path} has no operationId"
)
Вспомогательная функция operations() в том же файле перебирает schema["paths"] и отбрасывает ключи, которые не являются HTTP-методами.
OpenAPI paths
for each operation
CHECK
Так стандартизация превращается из просьбы «пожалуйста, не забудьте» в проверяемое требование. В учебном проекте девять таких тестов, включая сверку openapi/openapi.json с кодом.
83Проверка выполняется до объединения изменений
GitHub Actions запускает проверки на каждый push и pull request.
Прогон ci.yml после push в main: job contract прошёл за 19 с, breaking-changes пропущен, потому что это не pull request. Логи шагов GitHub показывает только после входа. Клик — увеличить.
84Документация должна показывать, какие операции защищены
Недостаточно написать в README «нужен токен». OpenAPI формально описывает security scheme.
В нашем проекте write operations требуют Bearer token:
Токен
Чтение
Запись
нет
да
401
demo-token
да
да
viewer-token
да
403
Swagger UI · Authorize
Bearer token
Protected operation
В production реальный механизм может использовать OAuth 2.0 / OpenID Connect: токен выдаёт сервер авторизации, а сервис проверяет его подпись и срок действия.
Swagger UI · AuthorizeСКРИНШОТ · 15.09.2026
Окно Available authorizations: схема BearerAuth (http, Bearer) и поле для токена. Операции записи отмечены замком. Клик — увеличить.
85Правильный Swagger ещё не делает API безопасным
OWASP API Security Top 10 описывает риски, характерные именно для API.
Риск
Как выглядит в Service Desk
Broken Object Level Authorization
сотрудник подставляет чужой ticket_id и читает чужое обращение
Broken Authentication
сервер принимает просроченный или поддельный токен
Broken Object Property Level Authorization
клиент меняет поле, которое ему менять нельзя
Наличие /docs и OpenAPI schema не является доказательством безопасности API.
Style guide задаёт правила. Код реализует контракт, из кода получается схема. По схеме строится документация, её проверяют линтер и тесты, а CI не даёт объединить изменение, которое нарушает правила.
API больше не является только набором функций Python.