J'ai lu des informations sur les stratégies de gestion des versions des API ReST, et aucune d'elles ne semble aborder la façon dont vous gérez la base de code sous-jacente.
Disons que nous apportons un tas de modifications de rupture à une API - par exemple, en modifiant notre ressource Client afin qu'elle renvoie des champs forename
et séparés surname
au lieu d'un seul name
champ. (Pour cet exemple, j'utiliserai la solution de gestion des versions d'URL car il est facile de comprendre les concepts impliqués, mais la question s'applique également à la négociation de contenu ou aux en-têtes HTTP personnalisés)
Nous avons maintenant un point de terminaison à http://api.mycompany.com/v1/customers/{id}
, et un autre point de terminaison incompatible à http://api.mycompany.com/v2/customers/{id}
. Nous publions toujours des corrections de bogues et des mises à jour de sécurité pour l'API v1, mais le développement de nouvelles fonctionnalités se concentre désormais sur la v2. Comment écrire, tester et déployer les modifications sur notre serveur API? Je peux voir au moins deux solutions:
Utilisez une branche / une balise de contrôle de source pour la base de code v1. v1 et v2 sont développés et déployés indépendamment, avec des fusions de contrôle de révision utilisées si nécessaire pour appliquer la même correction de bogue aux deux versions - de la même manière que vous gériez les bases de code pour les applications natives lors du développement d'une nouvelle version majeure tout en prenant en charge la version précédente.
Rendez la base de code elle-même consciente des versions de l'API, de sorte que vous vous retrouvez avec une seule base de code qui comprend à la fois la représentation client v1 et la représentation client v2. Traitez la gestion des versions comme faisant partie de l'architecture de votre solution plutôt que comme un problème de déploiement - probablement en utilisant une combinaison d'espaces de noms et de routage pour vous assurer que les demandes sont traitées par la version correcte.
L'avantage évident du modèle de branche est qu'il est facile de supprimer les anciennes versions d'API - arrêtez simplement de déployer la branche / balise appropriée - mais si vous exécutez plusieurs versions, vous pourriez vous retrouver avec une structure de branche et un pipeline de déploiement vraiment compliqués. Le modèle de «base de code unifiée» évite ce problème, mais (je pense?) Rendrait beaucoup plus difficile la suppression des ressources et des points de terminaison obsolètes de la base de code lorsqu'ils ne sont plus nécessaires. Je sais que c'est probablement subjectif car il est peu probable qu'il y ait une réponse simple et correcte, mais je suis curieux de comprendre comment les organisations qui gèrent des API complexes sur plusieurs versions résolvent ce problème.