Какие изменения REST API обратно совместимы для существующих клиентов?
- Что можно менять в API, не ломая клиентов?
- Что такое expand–contract?
Добавлять можно (новое необязательное поле в ответе, новый эндпоинт, новый необязательный параметр); удалять, переименовывать, менять тип и ужесточать — нельзя.
- Совместимость держится на «толерантном читателе»: клиент игнорирует незнакомые поля
- Опасные мелочи: новое значение enum, смена формата даты, необязательное поле стало обязательным
- Ломающее изменение — через expand–contract: добавить новое, перевести клиентов, удалить старое
А ещё Для неизбежных изменений — новая версия API и срок поддержки старой
Подробно
Совместимые изменения (для существующих клиентов):
- новое поле в ответе;
- новый необязательный параметр запроса со значением по умолчанию, как раньше;
- новый эндпоинт или метод;
- ослабление требований к входу (принимать больше форматов).
Несовместимые:
- удаление или переименование поля;
- изменение типа (
"price": "100"→100), формата даты, единиц измерения; - необязательное поле становится обязательным во входе;
- изменение смысла существующего значения или поведения по умолчанию;
- новое значение перечисления в ответе — ломает клиентов со строгим
switchбез ветки по умолчанию; об этом договариваются заранее.
Толерантный читатель — правило для клиентов: игнорировать незнакомые поля, не зависеть от порядка, обрабатывать неизвестные значения enum. Без него даже добавление поля ломает строгие десериализаторы (FAIL_ON_UNKNOWN_PROPERTIES в Jackson).
Expand–contract для ломающих изменений:
- расширить — добавить новое поле или эндпоинт рядом со старым, заполнять оба;
- перевести потребителей на новое, отслеживая использование старого;
- сократить — удалить старое, когда им никто не пользуется.
Тот же приём — для схем баз данных и событий в брокере.
Что хотят услышать
- Правило «добавлять можно, удалять и ужесточать нельзя» с примерами.
- Неочевидные ломающие изменения: enum, формат, обязательность.
- Толерантный читатель на стороне клиента.
- Expand–contract для неизбежных изменений.
Частые ошибки
- Считать переименование поля безобидным.
- Не учитывать клиентов со строгой десериализацией.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Добавить необязательное поле в ответ
- ✓Добавить необязательный параметр запроса
- ✓Добавить новый эндпоинт
- ✗Сделать ранее необязательное поле запроса обязательным
Что спросят дальше
- Как автоматически проверять совместимость в CI?
- Что такое expand–contract и где он ещё применяется?
Разбор темы
- Проектирование API: REST, gRPC и события
Выбор стиля взаимодействия, семантика и идемпотентность HTTP, формат ошибок, курсорная пагинация против offset, версионирование и обратная совместимость, контрактное тестирование.
Связанные вопросы
- Как гарантировать, что изменение вашего API не сломает потребителей, которых вы не контролируете? Middle
- Во время rolling update в проде одновременно работают старая и новая версии сервиса. Какое требование из этого следует? Middle
- Нужно переименовать колонку name в full_name без простоя при rolling-выкатке. Какая последовательность верна? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.