Как спроектировать REST API: ресурсы, ошибки и версия

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

Начните с ресурсов и действий

Составьте список сущностей, которые видит клиент: пользователь, заказ, документ, проект или уведомление. Для каждой сущности определите ключевые поля, связи и жизненный цикл. URL должен описывать ресурс, а HTTP-метод — действие над ним: чтение, создание, изменение или удаление.

Не превращайте каждую кнопку интерфейса в отдельный RPC-адрес. Если действие действительно меняет состояние, опишите его как понятную операцию над ресурсом или отдельный подресурс. Такая модель упрощает документацию и помогает клиентам строить предсказуемые запросы.

Выберите методы и идемпотентность

GET используют для получения данных, POST — для создания или запуска операции, PUT и PATCH — для изменения, DELETE — для удаления. Описание метода должно включать тело запроса, обязательные поля и возможные ответы. Для повторяемых запросов заранее решите, что произойдёт при сетевом повторе.

Идемпотентность особенно важна для платежей, бронирований и фоновых задач. Введите ключ операции, если повторная отправка может создать дубликат. Клиенту нужно объяснить, какие запросы можно безопасно повторять, а какие требуют проверки результата.

Согласуйте коды и формат ошибок

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

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

Читайте также:  Git workflow для команды: ветки, ревью и релиз

Продумайте версионирование

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

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

Проверьте контракт до релиза

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

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

Схема ресурсов REST API на доске
Хороший API начинается с понятной модели ресурсов и предсказуемых правил.

План проектирования API

Такой порядок помогает пройти от модели предметной области к проверяемому контракту.

  1. Опишите ресурсы, связи и основные пользовательские действия.
  2. Назначьте методы, параметры, обязательные поля и форматы дат.
  3. Согласуйте статусы и единую структуру ошибок.
  4. Решите, как повторяются операции и защищаются от дубликатов.
  5. Определите правила совместимости и срок поддержки версий.
  6. Соберите примеры для успешных и ошибочных сценариев.
  7. Проверьте контракт автотестами и документацией перед релизом.

Что зафиксировать в контракте

Таблица помогает не забыть детали, которые обычно всплывают на интеграции.

Область Что описать Проверка
Ресурс Поля, связи, жизненный цикл Примеры объекта и списка
Метод Параметры, тело, повторяемость Успешный и повторный запрос
Ошибка Код, идентификатор, подсказка Неверные данные и права
Версия Совместимость и срок поддержки Старый клиент проходит тесты
Ограничения Лимиты, пагинация, сортировка Граничные значения и нагрузка
Читайте также:  Какие бывают языки программирования?

Как принять API

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

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

Разработчик проверяет документацию API и ответы сервера
Контракт проверяют по реальным запросам, статусам и примерам ответов.

Частые ошибки и диагностика

Частая ошибка — делать URL по названиям кнопок, смешивать форматы ошибок и возвращать 200 для любого результата. Опасны также необъявленные лимиты, разные правила дат и изменение смысла поля без новой версии.

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

Полезные материалы

Для командной работы пригодится материал о Git workflow и ревью. Перед релизом также полезно проверить резервное копирование и восстановление.

Хороший REST API описывает ресурсы, правила операций и ошибки так, чтобы клиент мог работать без догадок. Начинайте с модели, фиксируйте контракт, проверяйте повторяемость и поддерживайте версию по заранее объявленному плану. В рабочем журнале оставьте дату проверки, исходные условия и следующий шаг. Такой протокол помогает повторить процедуру после обновления, смены сезона или изменения требований. Если материал передаётся другому специалисту, укажите ограничения рекомендации и ссылку на первоисточник. В рабочем журнале оставьте дату проверки, исходные условия и следующий шаг. Такой протокол помогает повторить процедуру после обновления, смены сезона или изменения требований. Если материал передаётся другому специалисту, укажите ограничения рекомендации и ссылку на первоисточник. В рабочем журнале оставьте дату проверки, исходные условия и следующий шаг. Такой протокол помогает повторить процедуру после обновления, смены сезона или изменения требований. Если материал передаётся другому специалисту, укажите ограничения рекомендации и ссылку на первоисточник. В рабочем журнале оставьте дату проверки, исходные условия и следующий шаг. Такой протокол помогает повторить процедуру после обновления, смены сезона или изменения требований. Если материал передаётся другому специалисту, укажите ограничения рекомендации и ссылку на первоисточник. В рабочем журнале оставьте дату проверки, исходные условия и следующий шаг. Такой протокол помогает повторить процедуру после обновления, смены сезона или изменения требований. Если материал передаётся другому специалисту, укажите ограничения рекомендации и ссылку на первоисточник. В рабочем журнале оставьте дату проверки, исходные условия и следующий шаг. Такой протокол помогает повторить процедуру после обновления, смены сезона или изменения требований. Если материал передаётся другому специалисту, укажите ограничения рекомендации и ссылку на первоисточник. В рабочем журнале оставьте дату проверки, исходные условия и следующий шаг. Такой протокол помогает повторить процедуру после обновления, смены сезона или изменения требований. Если материал передаётся другому специалисту, укажите ограничения рекомендации и ссылку на первоисточник.

Читайте также:  Git workflow для команды: ветки, ревью и релиз