web-dev-qa-db-fra.com

REST API: plusieurs versions, une seule application?

Je travaille sur une API REST où je vais devoir introduire quelques changements de rupture bientôt, donc une v2 est nécessaire. Nous devons encore prendre en charge la v1 pendant quelques mois en parallèle, pour donner nos clients ont le temps de passer à la nouvelle API chaque fois qu'ils sont prêts. Notre API est offerte via le cloud partagé, et tous nos clients partagent le même backend système, en particulier une seule base de données partagée.

J'ai trouvé beaucoup d'articles sur REST versionnage de l'API, mais ils étaient tous davantage du point de vue d'un client ou d'un point de vue de conception de haut niveau. Ce n'est pas vraiment mon problème, notre API a déjà une version dans l'URI, donc offrir des services avec un chemin de base/v2 ne sera pas un problème.

Cependant, je me demande comment je vais réellement mettre en œuvre cela, et je n'ai pas vraiment trouvé de bons articles à ce sujet. Je ne veux pas vraiment dériver une v2 de mon projet, puis créer et déployer des v1 et v2 en tant qu'applications distinctes, car alors j'aurais la maintenance, la correction de bugs, les changements de configuration, etc. dans deux applications, ce qui est un double travail et porte l'habituel dangers de redondance (ie: éventuelles incohérences entre les versions). De plus, la v2 n'est bien sûr pas différente dans chaque service, donc la plupart du code serait toujours le même.

Existe-t-il des meilleures pratiques sur la façon d'implémenter techniquement une API REST dans une seule application qui fournit plusieurs versions à l'extérieur, et où du code est partagé (par exemple: v2/someService serait redirigé en interne vers v1/someService), et juste les différences réelles sont codées dans les nouveaux services? Peut-être y a-t-il même des cadres qui aident à concevoir cela? L'application est codée en Java avec Spring MVC si cela est utile.

Je suis reconnaissant de tous conseils ou ressources sur la façon de résoudre ce problème. Merci!

9
user3237736

Si j'étais confronté à la situation dont vous parlez, j'essaierais d'abord de garder ma nouvelle version (v2) rétrocompatible avec ma première version (v1). Si tel était le cas, vous pourriez simplement ajouter des fonctionnalités et mettre à jour la documentation de votre API, en ne conservant qu'une seule base de code active. Je pense que vous pourriez même ajouter des choses à la charge utile de la réponse tant que les données qui reviennent ne briseraient le code de personne - un peu comme l'ajout de champs à un schéma de base de données existant.

Si la v2 n'était pas rétrocompatible avec la v1, vous pourriez éventuellement déplacer la v1 vers un autre serveur et informer vos utilisateurs qu'elle y est placée pour une période limitée et indiquée afin de leur donner le temps de faire les changements de code nécessaires pour passer à la v2, mais aussi de notifier eux que cette version n'est plus mise à jour et s'ils ont des problèmes, ils devront passer à la nouvelle version. Par conséquent, v2 est la version HEAD de votre base de code sans aucune autre branche en développement actif.

J'espère que cela aide et offre quelque chose auquel vous n'aviez pas déjà pensé.

0
Eric Green