C'est une question à la fois bonne et délicate. Le thème de la La conception de l'URI est en même temps la partie la plus importante d'une API REST et Il s'agit donc d'un un engagement à long terme envers les utilisateurs de cette API .
Étant donné que l'évolution d'une application et, dans une moindre mesure, de son API est une réalité et qu'elle est même similaire à l'évolution d'un produit apparemment complexe tel qu'un langage de programmation, l'équipe d'experts de la Commission européenne a été chargée d'élaborer un plan d'action pour l'évolution de l'application. Conception de l'URI devrait avoir moins contraintes naturelles et il doivent être préservées dans le temps . Plus la durée de vie de l'application et de l'API est longue, plus l'engagement envers les utilisateurs de l'application et de l'API est important.
D'autre part, il est difficile de prévoir toutes les ressources et leurs aspects qui seront consommés par l'intermédiaire de l'API. Heureusement, il n'est pas nécessaire de concevoir l'ensemble de l'API qui sera utilisée jusqu'à ce qu'elle soit utilisée. Apocalypse . Il suffit de définir correctement tous les points d'extrémité des ressources et le schéma d'adressage de chaque ressource et instance de ressource.
Au fil du temps, il se peut que vous deviez ajouter de nouvelles ressources et de nouveaux attributs à chaque ressource particulière, mais la méthode suivie par les utilisateurs de l'API pour accéder à une ressource particulière ne doit pas changer une fois que le schéma d'adressage d'une ressource devient public et donc définitif.
Cette méthode s'applique à la sémantique des verbes HTTP (par exemple, PUT doit toujours mettre à jour/remplacer) et aux codes d'état HTTP qui sont pris en charge dans les versions antérieures de l'API (ils doivent continuer à fonctionner de manière à ce que les clients de l'API qui ont fonctionné sans intervention humaine puissent continuer à travailler de la même manière).
En outre, étant donné que l'intégration de la version de l'API dans l'URI perturberait le concept de l'hypermédia comme moteur de l'état de l'application (comme indiqué dans la thèse de doctorat de Roy T. Fieldings) en ayant une adresse de ressource/URI qui changerait au fil du temps, je conclurais que Les versions de l'API ne doivent pas être conservées longtemps dans les URI des ressources ce qui signifie que les URI de ressources dont les utilisateurs de l'API peuvent dépendre doivent être des permaliens .
Bien sûr, il est possible d'intégrer la version de l'API dans l'URI de base pero uniquement pour des utilisations raisonnables et restreintes telles que le débogage d'un client API qui fonctionne avec la nouvelle version de l'API. Ces API versionnées doivent être limitées dans le temps et disponibles uniquement pour des groupes limités d'utilisateurs d'API (comme pendant les bêtas fermées). Sinon, vous vous engagez là où vous ne le devriez pas.
Quelques réflexions concernant la maintenance des versions de l'API qui ont une date d'expiration. Toutes les plateformes/langages de programmation couramment utilisés pour mettre en œuvre les services web (Java, .NET, PHP, Perl, Rails, etc.) permettent de lier facilement le(s) point(s) d'arrivée des services web à un URI de base. De cette manière, il est facile de rassembler et conserver un ensemble de fichiers/classes/méthodes distincts selon les différentes versions de l'API .
Du point de vue des utilisateurs de l'API, il est également plus facile de travailler et de se lier à une version particulière de l'API lorsque cela est évident, mais seulement pour une durée limitée, c'est-à-dire pendant le développement.
Du point de vue du responsable de l'API, il est plus facile de maintenir différentes versions de l'API en parallèle en utilisant des systèmes de contrôle de la source qui travaillent principalement sur des fichiers en tant que plus petite unité de versionnement (du code source).
Cependant, les versions de l'API étant clairement visibles dans l'URI, il y a une mise en garde : on peut également s'opposer à cette approche puisque L'historique de l'API devient visible/aparent dans la conception de l'URI et est donc susceptible de changer au fil du temps ce qui va à l'encontre des lignes directrices de REST. Je suis d'accord !
La façon de contourner cette objection raisonnable est de mettre en œuvre la dernière version de l'API sous l'URI de base de l'API sans version. Dans ce cas, les développeurs de clients de l'API peuvent choisir l'une ou l'autre option :
-
développent en fonction de la dernière version (s'engageant à maintenir l'application en la protégeant contre d'éventuelles modifications de l'API qui pourraient briser leur client API mal conçu ).
-
se lier à une version spécifique de l'API (qui devient apparente) mais seulement pour une durée limitée
Par exemple, si API v3.0 est la dernière version de l'API, les deux suivantes devraient être des alias (c'est-à-dire qu'elles se comportent de la même manière pour toutes les demandes d'API) :
http://shonzilla/api/customers/1234
http://shonzilla/api**/v3.0**/customers/1234
http://shonzilla/api**/v3**/customers/1234
En outre, les clients de l'API qui essaient encore de pointer vers le fichier ancien L'API doit être informée de l'utilisation de la dernière version de l'API, si la version de l'API qu'ils utilisent est obsolète ou n'est plus prise en charge . Ainsi, l'accès à l'un des URI obsolètes tels que ceux-ci :
http://shonzilla/api**/v2.2**/customers/1234
http://shonzilla/api**/v2.0**/customers/1234
http://shonzilla/api**/v2**/customers/1234
http://shonzilla/api**/v1.1**/customers/1234
http://shonzilla/api**/v1**/customers/1234
doit renvoyer l'un des éléments suivants 30x Codes d'état HTTP indiquant une redirection qui sont utilisés en conjonction avec Location
En-tête HTTP qui redirige vers la version appropriée de l'URI de la ressource qui reste celle-ci :
http://shonzilla/api/customers/1234
Il existe au moins deux codes d'état HTTP de redirection qui conviennent aux scénarios de versionnement de l'API :
-
301 Déplacé de façon permanente indiquant que la ressource avec un URI demandé est déplacée de façon permanente vers un autre URI (qui devrait être un permalien d'instance de ressource ne contenant pas d'informations sur la version de l'API). Ce code d'état peut être utilisé pour indiquer une version d'API obsolète/non prise en charge, en informant le client de l'API qu'une version de l L'URI de la ressource versionnée a été remplacé par un permalien de la ressource. .
-
302 Trouvé indiquant que la ressource demandée se trouve temporairement à un autre endroit, alors que l'URI demandé peut toujours être pris en charge. Ce code d'état peut être utile lorsque les URI sans version sont temporairement indisponibles et qu'une demande doit être répétée en utilisant l'adresse de redirection (par exemple en pointant vers l'URI avec la version APi intégrée) et que nous voulons indiquer aux clients de continuer à l'utiliser (c.-à-d. les permaliens).
-
d'autres scénarios peuvent être trouvés dans Redirection chapitre 3xx de la spécification HTTP 1.1