Подготовка к вопросам по API на технических собеседованиях
Вопросы о проектировании и принципах работы API регулярно звучат на собеседованиях для backend- и full-stack разработчиков. Понимание архитектурных подходов, сетевых протоколов и способов оптимизации взаимодействия — обязательный навык для создания надежного ПО. В данном руководстве разобраны ключевые концепции, знание которых поможет успешно пройти интервью и проектировать эффективные API.
CRUD и REST: основы взаимодействия
Концепция REST представляет систему как набор ресурсов, управляемых стандартными методами HTTP. Базовые операции CRUD сопоставляются со следующими HTTP-методами: POST служит для создания нового ресурса (метод не идемпотентен, повторные запросы создают дубликаты); GET используется для безопасного чтения данных без изменения состояния сервера; PUT полностью заменяет существующий ресурс или создает его; PATCH выполняет частичное обновление полей; DELETE удаляет указанный ресурс.
На интервью также спрашивают про редкие методы HTTP: HEAD (запрос заголовков ответа без тела для проверки существования ресурса) и OPTIONS (список поддерживаемых методов для URL, применяется в CORS).
Различия между PUT и PATCH: тонкости обновления ресурсов
Выбор между PUT и PATCH — частый вопрос на собеседовании. Различие кроется в объеме обновляемых данных:
- PUT полностью заменяет ресурс. При обновлении email в профиле пользователя клиент обязан прислать весь объект с остальными полями. Непереданные свойства могут быть стерты или заменены дефолтными значениями.
- PATCH изменяет только переданные поля (например,
{ "status": "Shipped" }), снижая сетевой трафик.
С точки зрения идемпотентности:
- PUT всегда идемпотентен: повторные вызовы с одинаковым телом оставляют ресурс в одном и том же состоянии.
- PATCH не гарантирует идемпотентность по спецификации. Если PATCH-запрос содержит инструкцию добавить элемент в список или увеличить значение счетчика, то повторные вызовы изменят состояние ресурса.
Классификация HTTP статус-кодов
Статус-коды сообщают клиенту о результатах обработки его запроса. Они разделены на пять категорий: 1xx (Информационные — передача данных продолжается), 2xx (Успешные — запрос принят и обработан), 3xx (Перенаправления — требуются действия от клиента), 4xx (Ошибки клиента — некорректный запрос), 5xx (Ошибки сервера — внутренние сбои).
Популярные статус-коды на интервью:
- 200 OK (успешный GET-запрос), 201 Created (ресурс создан через POST), 204 No Content (успешный DELETE без тела ответа).
- 400 Bad Request (ошибка валидации), 401 Unauthorized (неверный или отсутствующий токен), 403 Forbidden (отсутствие прав доступа).
- 404 Not Found (ресурс не существует), 409 Conflict (конфликт с текущим состоянием ресурса, например, дублирование уникального поля).
- 500 Internal Server Error (сбой внутренней логики сервера).
Концепция Statelessness (бессостоятельности)
REST API проектируются как Stateless. Сервер не сохраняет контекст сессии клиента между запросами. Каждый запрос является самодостаточным и несет в себе все необходимые данные, включая авторизационные токены.
Преимущества подхода:
- Упрощение сервера: Нет необходимости управлять сессиями и синхронизировать их состояние.
- Масштабируемость: Запросы клиента могут обрабатываться любым сервером за балансировщиком нагрузки.
- Отказоустойчивость: Падение сервера не приводит к потере сессии пользователя.
Вместо сессий на сервере авторизация реализуется через токены (например, JWT), передаваемые в заголовках.
Обеспечение безопасности API
Защита данных — ключевая задача при проектировании API. Основные методы защиты:
- Аутентификация и авторизация: Использование API-ключей для простых интеграций, JWT для пользовательских сессий и OAuth для предоставления прав внешним сервисам.
- Rate Limiting (ограничение частоты): Защита серверов от перегрузок. Применяются алгоритмы: Fixed Window Counter (подсчет в фиксированных окнах), Sliding Log (точный расчет по логу), Sliding Window Counter (усреднение по окнам), Token Bucket (накопление токенов в ведро).
- Валидация данных: Очистка входящих параметров для защиты от SQL-инъекций и XSS.
- Шифрование: Использование HTTPS (SSL/TLS) для защиты трафика и шифрование данных в базах данных (encryption at rest).
Версионирование API
Версионирование гарантирует обратную совместимость при изменении логики эндпоинтов. Основные подходы:
- URL-версионирование: Номер версии указывается в пути (например,
/api/v1/users). Метод прост в реализации и легко кэшируется. - Параметры запроса: Версия передается как GET-параметр (
/api/users?api-version=1). - Кастомные заголовки: Номер версии передается в заголовке (например,
Accept: application/vnd.company.v2+json). Сохраняет URL чистыми, но усложняет кэширование.
Версионирование повышает сложность поддержки кодовой базы, требуя сопровождения устаревших версий до их вывода из эксплуатации.
Стратегии пагинации
Разбиение больших массивов данных на страницы снижает нагрузку на БД и сеть. Способы реализации:
- Limit-Offset пагинация: Клиент указывает количество записей (
limit) и смещение (offset). Пример:GET /items?limit=10&offset=20. Неэффективен на больших смещениях из-за сканирования всей таблицы БД. - Page Number пагинация: Оперирует номером страницы и ее размером. Пример:
GET /items?page=3&size=10. - Keyset пагинация: Выборка на основе уникального ключа (ID или timestamp). Пример:
GET /items?after=105&limit=10. Хорошо использует индексы БД и стабильно при обновлении данных. - Cursor-Based пагинация: Использование закодированного указателя (курсора) на последний элемент. Пример:
GET /items?cursor=eyJpZCI6MjB9. Метод идеален для бесконечных лент, но не позволяет переходить на произвольные страницы.
Идемпотентность и надежность распределенных систем
Идемпотентность означает, что повторение одного и того же запроса дает тот же результат, что и один запрос. GET, DELETE, PUT, HEAD, OPTIONS идемпотентны; POST — нет.
Это свойство критично при сетевых сбоях. Если клиент отправил запрос на оплату, но получил таймаут, он может повторить попытку с тем же ключом идемпотентности (Idempotency-Key в заголовке). Сервер распознает дубликат, не спишет деньги повторно и вернет результат первой транзакции. Идемпотентность гарантирует согласованность данных и упрощает обработку ошибок.
Методы оптимизации производительности API
Для повышения пропускной способности API используются следующие подходы:
- Кэширование: Клиентское (заголовки
Cache-Control,ETag), серверное (в Redis/Memcached), CDN-кэширование для статики, распределенное кэширование и кэширование запросов к СУБД. - Оптимизация БД: Создание индексов, оптимизация JOIN-операций, анализ планов выполнения запросов (EXPLAIN).
- Connection Pooling: Повторное использование открытых соединений с БД вместо создания нового подключения.
- Бинарная сериализация: Применение протоколов вроде Protocol Buffers для уменьшения размера пакетов и ускорения сериализации по сравнению с JSON.
- Сжатие: Использование алгоритмов Gzip или Brotli для уменьшения размера тела ответов.
Документирование с использованием OpenAPI
Спецификация OpenAPI (Swagger) является стандартом описания HTTP API. Она позволяет создавать интерактивные веб-страницы, где сторонние разработчики могут изучать эндпоинты, типы принимаемых данных, примеры ответов и совершать пробные запросы прямо из браузера.
Практический чек-лист проектирования нового эндпоинта
При создании нового эндпоинта следуйте данной процедуре:
- Определение семантики: Выберите HTTP-метод в зависимости от типа операции.
- Проектирование URL: Разработайте понятную структуру пути (например,
POST /api/v1/orders). - Определение статус-кодов: Зафиксируйте коды ответов для успешных сценариев (200, 201) и возможных ошибок (400, 401, 403, 404, 409).
- Оценка идемпотентности: Для POST-запросов настройте логику работы с ключом идемпотентности на сервере.
- Настройка авторизации: Определите права доступа и требования к передаче авторизационного токена.
- Реализация валидации: Опишите правила проверки всех входящих полей (типы, обязательность параметров).
- Проектирование пагинации: Для списков используйте keyset или cursor-based пагинацию со стабильной сортировкой.
- Применение лимитов частоты: Задайте ограничения по количеству запросов (rate limits).
- Настройка кэширования: Оцените целесообразность кэширования ответов GET-запросов.
- Создание OpenAPI-контракта: Задокументируйте структуру запроса и ответов в OpenAPI.
- Верификация и тестирование: Проверьте ответы при неверных токенах (401/403) и невалидных параметрах (400). Протестируйте крайние случаи пагинации (первая, последняя и пустая страницы) и запустите тесты соответствия OpenAPI-контракту.

