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

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

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

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



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



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

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

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



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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы