Skip to content

Проектирование API ​

Новый раздел

Этот раздел добавлен как дополнение к исходной структуре — стандарты проектирования API критичны для команды.

Принципы ​

  1. Единообразие — единообразные эндпоинты, именование, формат ошибок
  2. Обратная совместимость — не ломаем существующих клиентов
  3. Сначала контракт — API-контракт определяется до реализации
  4. Документация как код — OpenAPI/Protobuf как источник истины

REST API ​

URL-конвенции ​

GET    /api/v1/users          — список
GET    /api/v1/users/{id}     — одна сущность
POST   /api/v1/users          — создание
PUT    /api/v1/users/{id}     — полное обновление
PATCH  /api/v1/users/{id}     — частичное обновление
DELETE /api/v1/users/{id}     — удаление
  • Существительные во множественном числе: /users, не /user
  • Kebab-case для составных URL: /payment-methods
  • Вложенность не глубже 2 уровней: /users/{id}/orders

Формат ответов ​

json
{
  "data": { ... },
  "meta": {
    "page": 1,
    "per_page": 20,
    "total": 100
  }
}

Формат ошибок ​

json
{
  "error": {
    "code": "INSUFFICIENT_FUNDS",
    "message": "Not enough balance to complete the transaction",
    "details": [
      {
        "field": "amount",
        "reason": "Requested 100.00, available 50.00"
      }
    ]
  }
}

HTTP Status Codes ​

КодКогда
200Успешный запрос
201Ресурс создан
204Успешно, нет тела ответа
400Невалидный запрос
401Не аутентифицирован
403Нет прав
404Ресурс не найден
409Конфликт (duplicate, race condition)
422Валидация не прошла
429Rate limit
500Внутренняя ошибка

gRPC ​

  • Protobuf как IDL
  • Следуем Google API Design Guide
  • Версионирование через package name: ventra.payments.v1

Версионирование API ​

  • Мажорная версия в URL: /api/v1/, /api/v2/
  • Минорные изменения — backward compatible, без смены версии
  • Deprecated эндпоинты: заголовок Sunset + документация миграции

Пагинация ​

Используем cursor-based pagination для больших коллекций:

GET /api/v1/orders?cursor=abc123&limit=20

Offset-based допустим для админ-панелей и небольших наборов данных.