Здравствуйте, надо написать API к сервису.
Задача вроде бы понятная и вопрос уже много раз задавали тут, но… тут все посложнее. Собственно сейчас я поделюсь своим мнением и призываю к обсуждению оного.
Что хочется:
- Версионность
- Нет дублированию кода
Версионность
Неплохо, когда у сервиса есть API, но беда, когда он готовит новую версию, релизит её и все старые клиенты возможно перестают работать. Для этого и нужна версионность. И поддержка старых версий.
Я не сторонник архитектуры REST (не будем о ней), поэтому версию и тип данных будем передавать в урл, например
service.com/api/v3/json/. Так же хочется ограничиться
только POST запросами с указанием вызываемого метода и сопутствующими параметрами. На данный момент жизни я считаю, что с этим сторонним разработчикам будет удобнее всего работать.
Нет дублированию кода
Я подумал, что неплохо, если сервис внутри будет работать с теми же моделями, что и API. Поэтому, если делать версионность API, то с новой версией надо будет, допустим, просто копировать папку моделей, тем самым создавая новую версию, и править только эту папку, чтобы абсолютно не влиять на другие версии, чтобы сторонние разработчики спокойно спали. Проект внутри всегда должен работать с последней версией моделей. Контроллер для API должен будь всего один и желательно на все версии и просто перенаправлять запрос в нужную модель из запроса (или по карте методов).
Думал так — если все же какую-либо обработку делать в контроллерах, то все равно от модификации моделей вы не убережетесь, а при правке моделей изменения будут влиять на все версии, поэтому модели все равно надо будет копировать или придумывать разноверсионное храниение — это не важно, главное, что изменениея будут в двух местах.
Приглашаю хорошенечко обсудить это решение.