Получить доступ

Какие изменения REST API обратно совместимы для существующих клиентов?

MiddleПроектирование API
Ещё спрашивают так:
  • Что можно менять в API, не ломая клиентов?
  • Что такое expand–contract?
Коротко

Добавлять можно (новое необязательное поле в ответе, новый эндпоинт, новый необязательный параметр); удалять, переименовывать, менять тип и ужесточать — нельзя.

  • Совместимость держится на «толерантном читателе»: клиент игнорирует незнакомые поля
  • Опасные мелочи: новое значение enum, смена формата даты, необязательное поле стало обязательным
  • Ломающее изменение — через expand–contract: добавить новое, перевести клиентов, удалить старое

А ещё Для неизбежных изменений — новая версия API и срок поддержки старой

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Совместимые изменения (для существующих клиентов):

  • новое поле в ответе;
  • новый необязательный параметр запроса со значением по умолчанию, как раньше;
  • новый эндпоинт или метод;
  • ослабление требований к входу (принимать больше форматов).

Несовместимые:

  • удаление или переименование поля;
  • изменение типа ("price": "100" → 100), формата даты, единиц измерения;
  • необязательное поле становится обязательным во входе;
  • изменение смысла существующего значения или поведения по умолчанию;
  • новое значение перечисления в ответе — ломает клиентов со строгим switch без ветки по умолчанию; об этом договариваются заранее.

Толерантный читатель — правило для клиентов: игнорировать незнакомые поля, не зависеть от порядка, обрабатывать неизвестные значения enum. Без него даже добавление поля ломает строгие десериализаторы (FAIL_ON_UNKNOWN_PROPERTIES в Jackson).

Expand–contract для ломающих изменений:

  1. расширить — добавить новое поле или эндпоинт рядом со старым, заполнять оба;
  2. перевести потребителей на новое, отслеживая использование старого;
  3. сократить — удалить старое, когда им никто не пользуется.

Тот же приём — для схем баз данных и событий в брокере.

Что хотят услышать

  • Правило «добавлять можно, удалять и ужесточать нельзя» с примерами.
  • Неочевидные ломающие изменения: enum, формат, обязательность.
  • Толерантный читатель на стороне клиента.
  • Expand–contract для неизбежных изменений.

Частые ошибки

  • Считать переименование поля безобидным.
  • Не учитывать клиентов со строгой десериализацией.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Добавить необязательное поле в ответ
  • ✓Добавить необязательный параметр запроса
  • ✓Добавить новый эндпоинт
  • ✗Сделать ранее необязательное поле запроса обязательным

Что спросят дальше

  • Как автоматически проверять совместимость в CI?
  • Что такое expand–contract и где он ещё применяется?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем