Чтение 5 минут

Как спроектировать понятный API


Как спроектировать понятный API - Студия Вебтую

Интерфейс для обмена данными живёт годами, и неудачные решения приходится поддерживать вместе с ним. Переименовать поле или изменить формат ответа после того, как к API подключились сторонние клиенты, стоит дороже, чем спроектировать всё аккуратно с самого начала. Ниже — порядок, в котором мы проектируем интерфейс, и правила, которые экономят время в дальнейшем.

Начинаем со сценариев, а не с таблиц

Самая частая ошибка — сделать по методу на каждую таблицу базы данных. Такой интерфейс повторяет внутреннее устройство системы, и любая перестройка хранения ломает клиентов. Мы начинаем с вопроса, что именно должен сделать потребитель API: оформить заказ, получить список отгрузок за период, отменить бронирование, узнать статус.

Для каждого сценария выписываем: какие данные нужны на входе, что возвращается, что происходит при ошибке и при повторе. Только после этого появляются ресурсы и методы. Проверка простая: если для одного действия клиента нужно сделать пять запросов и собрать данные у себя, интерфейс спроектирован под базу, а не под задачу.

Именование и структура ресурсов

  • Одна сущность называется одинаково везде: если это order, то и в адресе, и в поле ответа, и в документации это order, а не deal в одном месте и purchase в другом.
  • Адрес описывает ресурс, а действие задаёт метод запроса. Списки — во множественном числе, вложенность — не глубже двух уровней.
  • Единый стиль имён полей по всему интерфейсу. Смешение стилей в одном ответе — верный признак того, что методы писали разные люди и не сверялись.
  • Один формат даты и времени во всех методах, с указанием зоны. Разные форматы в разных методах — источник ошибок, которые всплывают через месяцы.
  • Идентификаторы возвращаем строками: числовой идентификатор в некоторых языках теряет точность при разборе.

Основные правила

ПравилоПочему
Предсказуемые именаОдинаковые сущности называются одинаково везде
Понятные коды ответовКлиент должен отличать «нет данных» от «ошибка сервера»
Структурированные ошибкиКод, сообщение и поле — а не просто текст
Постраничная выдачаСписки растут, отдать всё разом нельзя
ВерсионированиеИзменения не должны ломать существующих клиентов
ИдемпотентностьПовтор запроса не создаёт второй заказ
Ограничение частотыОдин клиент не должен класть сервис запросами
Секреты в заголовкахАдреса запросов попадают в логи и историю браузера
Единый формат датРазные форматы ломают разбор на стороне клиента
Тестовый контурИнтеграцию нельзя отлаживать на боевых данных

Коды ответов и формат ошибок

Код ответа — первое, на что смотрит клиентский код. Успех — 200 или 201 при создании, 204 когда возвращать нечего. Ошибка в данных запроса — 400, отсутствие авторизации — 401, недостаток прав — 403, несуществующий ресурс — 404, конфликт состояния — 409, превышение лимита частоты — 429, сбой на нашей стороне — 500. Ответ 200 с текстом ошибки внутри тела — распространённая и дорогая ошибка: клиент считает такой запрос успешным и продолжает работать с испорченными данными.

Тело ошибки делаем одинаковым во всех методах: машинный код ошибки, человеческое сообщение, поле, к которому относится проблема, и идентификатор запроса. Последний позволяет по обращению клиента найти конкретный вызов в логах, не выспрашивая подробности. Список кодов ошибок должен быть закрытым и описанным — клиенты строят на нём свою логику.

Пагинация, фильтры и сортировка

Любой список рано или поздно вырастет. Отдавать его целиком нельзя, поэтому пагинация закладывается сразу, даже если сейчас в таблице сотня строк. Постраничная выборка по номеру страницы проста, но на изменяющихся данных пропускает и дублирует записи; выборка по курсору от этого свободна и лучше подходит для больших наборов.

Правила, которых мы держимся: максимальный размер страницы ограничен сервером, а не клиентом; в ответе всегда есть признак наличия следующей страницы; набор допустимых полей для фильтрации и сортировки описан явно, а не собирается из произвольных параметров. Свободная фильтрация по любому полю выглядит удобной ровно до первого запроса, который кладёт базу.

Версионирование и обратная совместимость

Версия указывается явно — в адресе или в заголовке — и не меняется молча. Добавление нового необязательного поля в ответ совместимо; удаление поля, переименование, смена типа и превращение необязательного параметра в обязательный — нет. Такие изменения выпускаются новой версией, а старая живёт объявленный срок.

  • Клиент обязан игнорировать неизвестные поля в ответе — это условие фиксируется в документации.
  • Об отключении версии предупреждаем заранее и в самом ответе, а не только в рассылке.
  • Значения перечислений расширяем осторожно: клиент может не знать нового статуса и должен вести себя предсказуемо.

Идемпотентность и повторные запросы

Сеть теряет ответы. Клиент отправил запрос на создание заказа, ответ не дошёл, клиент повторил — и заказов стало два. Решение стандартное: клиент передаёт ключ идемпотентности, сервер запоминает результат первой обработки и на повтор с тем же ключом возвращает тот же ответ вместо нового действия. Чтение и удаление идемпотентны по своей природе, проблема касается создающих и изменяющих запросов.

Отдельно договариваемся о поведении при таймауте: сколько ждёт клиент, сколько раз повторяет и с какой задержкой. Повтор без нарастающей паузы превращает единичный сбой в лавину запросов.

Авторизация, ключи и ограничения по частоте

Ключ или токен передаётся в заголовке, а не в адресе запроса: адреса попадают в логи веб-сервера, историю браузера и заголовок источника перехода. У каждого потребителя — свой ключ, чтобы его можно было отозвать, не затрагивая остальных, и понимать по логам, кто именно создаёт нагрузку. Права ключа ограничиваем набором операций, которые действительно нужны интеграции.

Ограничение частоты — не столько защита от злоумышленника, сколько защита от чужой ошибки в цикле. В ответ на превышение возвращаем 429 и указываем, когда можно повторить; текущий остаток лимита полезно отдавать в заголовках каждого ответа, чтобы клиент мог притормозить сам.

Документация, вебхуки и тестовый контур

Документация обязательно содержит адреса методов и параметры с примерами запроса и ответа, формат и полный список ошибок, способ авторизации, ограничения по частоте и порядок уведомления об изменениях версии. Примеры должны быть рабочими: их копируют целиком.

Если система шлёт вебхуки, доставка проектируется отдельно. Получатель может ответить ошибкой или не ответить вовсе, поэтому нужны повторные попытки с нарастающей паузой, подпись сообщения для проверки отправителя и уникальный идентификатор события — принимающая сторона обязана уметь обработать один и тот же вызов дважды без последствий.

Тестовый контур с отдельными ключами и данными обязателен: интеграцию нельзя отлаживать на боевых заказах. Готовность интерфейса мы проверяем практикой — даём документацию разработчику, не участвовавшему в проекте, и просим сделать простую интеграцию. Каждое место, где он приходит с вопросом, нужно исправить в интерфейсе или в описании.

Если нужен интерфейс обмена данными между сайтом, учётной системой и мобильным приложением, мы спроектируем его и опишем: разработка информационных систем и интеграций. Начинаем с разбора сценариев обмена.

Нужна помощь с сайтом?

Срочные ошибки исправим за 24 часа, работа от 2 500 руб./час.

Техническая поддержка и сопровождение сайта

По теме статьи

Мы это уже делали

Похожие статьи

Нужен новый сайт?

Оставьте контакты — вернёмся с вопросами по задаче и ориентиром по срокам и стоимости.

Читайте также

Разбираем задачи, с которыми к нам приходят: от структуры сайта до поддержки и продвижения.

Внимание: мошенники представляются сотрудниками Вебтую Внимание: мошенники представляются сотрудниками Вебтую Посторонний человек обращается к рекламным и маркетинговым агентствам от имени Вебтую через Telegram-аккаунт @vetaroki22010, заказывает работы и не оплачивает и 10-09-2026 Читать Работа в digital: процессы, инструменты и команда Работа в digital: процессы, инструменты и команда Цифровые проекты редко проваливаются из-за технологий: чаще мешает организация работы. Разбираем этапы, роли, постановку задач, инструменты распределённой коман 30-08-2026 Читать Реклама и аналитика: как считать заявки, а не клики Реклама и аналитика: как считать заявки, а не клики Показы и клики не отвечают на вопрос, сколько принесла реклама. Разбираем, как настроить цели, разметить источники, учесть звонки и связать заявку со сделкой, ч 30-08-2026 Читать Поддержка сайта: обновления, резервные копии и безопасность Поддержка сайта: обновления, резервные копии и безопасность Сайт без регулярного обслуживания ломается предсказуемо. Разбираем, из чего состоит поддержка: обновления, резервные копии, доступы, безопасность, выбор хостинг 30-08-2026 Читать Техническое SEO: индексация, скорость и структура сайта Техническое SEO: индексация, скорость и структура сайта Техническая часть сайта решает, попадут ли страницы в индекс и дождётся ли их посетитель. Разбираем структуру и адреса, индексацию и дубли, работу с устаревшими 30-08-2026 Читать Продвижение сайта в поиске: стратегия, семантика и ссылки Продвижение сайта в поиске: стратегия, семантика и ссылки Разбираем продвижение сайта в поиске от постановки цели до регулярной работы: как собрать и разложить семантику по страницам, что должно быть на посадочной стра 30-08-2026 Читать Тексты для сайта: как писать, чтобы читали и покупали Тексты для сайта: как писать, чтобы читали и покупали Как выбрать тему для страницы и построить текст, который просматривают глазами и дочитывают, чем заменить оценочные формулировки, как переработать существующую 30-08-2026 Читать Автоматизация бизнеса: CRM, ERP и искусственный интеллект Автоматизация бизнеса: CRM, ERP и искусственный интеллект С чего начинать автоматизацию и что автоматизировать в первую очередь, чем различаются CRM, ERP и системы документооборота, внедрять по модулям или всё сразу, г 30-08-2026 Читать Как устроена разработка: технологии, тестирование и инструменты Как устроена разработка: технологии, тестирование и инструменты Из чего состоит веб-проект, как выбирают язык, фреймворк и базу данных, зачем нужны тестирование и контроль версий, где заканчиваются возможности low-code и ген 30-08-2026 Читать Создание сайта: от технического задания до запуска Создание сайта: от технического задания до запуска Проекты срываются не из-за технологий, а из-за неясных договорённостей. Разбираем весь путь создания сайта: как сформулировать цель, что должно быть в техническ 30-08-2026 Читать
Обсудить проект