Как правильно написать API сервиса?

Здравствуйте, надо написать API к сервису.

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

Что хочется:
  1. Версионность
  2. Нет дублированию кода



Версионность



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

Я не сторонник архитектуры REST (не будем о ней), поэтому версию и тип данных будем передавать в урл, например service.com/api/v3/json/. Так же хочется ограничиться
только POST запросами с указанием вызываемого метода и сопутствующими параметрами. На данный момент жизни я считаю, что с этим сторонним разработчикам будет удобнее всего работать.

Нет дублированию кода



Я подумал, что неплохо, если сервис внутри будет работать с теми же моделями, что и API. Поэтому, если делать версионность API, то с новой версией надо будет, допустим, просто копировать папку моделей, тем самым создавая новую версию, и править только эту папку, чтобы абсолютно не влиять на другие версии, чтобы сторонние разработчики спокойно спали. Проект внутри всегда должен работать с последней версией моделей. Контроллер для API должен будь всего один и желательно на все версии и просто перенаправлять запрос в нужную модель из запроса (или по карте методов).

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

Приглашаю хорошенечко обсудить это решение.
  • Вопрос задан
  • 5134 просмотра
Пригласить эксперта
Ответы на вопрос 4
blo
@blo
инженер-программист
Занимался недавно подобным. У меня получились модели общие, обработка в контроллерах. И кстати уже когда делал — пытался представить ситуацию что необходимо будет делать еще одну версию — не получилось. Все гипотетические изменения укладывались в текущую версию с учетом обратной совместимости, но возможность версионности оставил.

Перед написанием изучил довольно много литературы, блогов и презентаций, начал даже писать статью на хабре но пока что лень победила. Самое полезное что я читал — REST API Design Rulebook, рекомендую.
Ответ написан
arturich
@arturich Автор вопроса
KeepYourMind Да просто в url нагляднее это
Ответ написан
eigrad
@eigrad
Python-разработчик / Linux-админ
@egorinsk
Дублировать модели нельзя по определению. У вас изменилась структура данных в хранилище (например, в БД), а вы работаете с новой таблицей при помощи старого кода?

Выход только один — сделать API из как можно более простого и тонкого слоя контроллеров, и при изменении моделей править их. Можно подумать над генерацией АПИ автоматически, например, на основе описания (имя функции АПИ — задействованные модели — передаваемые поля и их преобразование), если это возможно. Из этого же описания можно при особо удачном раскладе генерировать документацию на АПИ.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы