2015-06-16 2 views
2

У меня есть API Rest, созданный с помощью Express, это потребляется клиентом iOS. иногда я должен вносить изменения в некоторые конечные точки (Breaking Changes), я выпущу новое встроенное приложение iOS, но может случиться, что не все пользователи обновляют клиентское событие, если клиент запускает приложение, и я развертываю новую версию бэкэнд.Поддерживать несколько версий API Rest

  1. Как поддерживать несколько версий бэкэнд?
  2. Что такое хороший способ сделать это без наличия сложных правил в коде
  3. В случае, если я выполняю различные экземпляры множественности базы и ответ на каждый клиент с правильной версией, теперь нужно иметь дело с базой данных?

Как @MikeBrant propouse я уменьшить объем

Я использую

  • Узел
  • Экспресс
  • Postgres

Я не использую каркас, такой как sailjs или loopback

+0

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

+0

@MikeBrant вы можете дать несколько советов, как уменьшить область действия. – rkmax

+0

На самом деле нет хорошего способа уменьшить объем этого вопроса. Нужно быть знакомым с вашей логикой приложения, хранилищем данных, механизмом маршрутизации и т. Д., Чтобы подумать о том, как наилучшим образом обеспечить управление версиями API для вашего варианта использования. –

ответ

0

Майк прав, трудно сказать, какое лучшее решение для вашего конкретного API может быть. Однако, чтобы предоставить вам возможное решение, вот очень простой способ поддерживать разные версии API. Конечно, это основано на множестве предположений и может быть не лучшим или самым чистым решением для вашего API.

Для простых API-интерфейсов вы можете поддерживать разные версии, определяя константу в своем приложении. Эта константа будет путь к корню вашей конечной точки API. Как правило, это будет иметь то же имя, что и версия вашего приложения, например «myApp/v1-8-5 /», если ваша версия приложения будет 1,8,5. На стороне сервера вы должны поддерживать каталог для каждой версии вашего приложения, который будет содержать полный API. В каждой новой версии вашего приложения вы обновляете Constant и добавляете новый каталог в свою конечную точку.

Это не самое элегантное решение и, как было сказано выше, это не может быть лучшим решением для ваших нужд, но это решение ....

+0

Предполагая это решение, Как работать с базой данных? – rkmax

+0

Если вы меняете структуру базы данных, то все ставки отключены. Если структура не изменяется, и вы просто добавляете ее, тогда код в вашем API должен учитывать изменения. Кроме того, просто хочу снова заявить, что это не может быть лучшим решением для вашего API, потребуется гораздо больше деталей, чтобы дать вам конкретный ответ для вашего API. – rmp

0

Перво-наперво, REST для потребляющих ресурсы и один мог бы утверждать, что вы используете его именно для того, чтобы отделить его от реализации backend (что означает, что он не заботится о том, какая база данных, структура, ... вы используете).

Во-вторых, если у вас есть полная реализация для первой версии, то его необходимо заморозить, что в отношении означает, что не касайтесь реализации backend для этой версии, скопируйте маршруты и соответствующим образом измените их.

ИМХО (что я бы делать):

  1. Написать тест для первой версии, так что вы не нарушаете что-то (обязательное)
  2. Префикс ваши URLs с REST версии (как и все остальные, ничего нового здесь), например: api/v1/... или что-то в этом роде
  3. Поскольку вы используете экспресс, вы всегда можете прикрепить свои маршруты некоторой переменной, скажем apiPath ('api/v1' для первого, 'api/v2'), так что у вас получилось что-то вроде приложения.delete (apiPath + '/ photos /: id')

Теперь это то место, где оно начинает становиться сложным, и это домен вашей проблемы. Если это всего лишь модельный домен (новые данные могут быть сохранены/извлечены), это легко. Модели Suplement с геттерами/сеттерами, которые используют атрибуты в зависимости от версии API . Допустим, вы используете moongose: `

userSchema.virtual('v1_properties').get(function() { 
    return ['email', 'name']; 
}); 
userSchema.virtual('v2_properties').get(function() { 
    return ['email', 'name', 'surname']; 
}); 
modelSchema.virtual('attributes').get(function() { 
    // atributes that are prefixed with api version 
    var self = this; 
    var json = {}; 
    self[apiVersion + '_properties'].foreach(function(key) { 
     json[key] = self[key]; 
    }); 

    return json; 
}); 

` Для инкубационных вы делаете то же самое. Конечно Плохая идея для пары Версия API с моделями, это только, к примеру, цели.

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

Я надеюсь, что это было полезно для вас в некотором роде. Дайте мне знать, если у вас есть дополнительные вопросы или если вы можете указать вашу проблему более подробно, и я попробую , чтобы обновить ответ. `

Смежные вопросы