C'est une bonne et une question délicate. Le sujet de la conception d'URI est en même temps la partie la plus importante d'une API REST et , par conséquent, un engagement potentiellement à long terme envers les utilisateurs de cette API .
Étant donné que l'évolution d'une application et, dans une moindre mesure, son API est une réalité et qu'elle est même similaire à l'évolution d'un produit apparemment complexe comme un langage de programmation, la conception de l' URI devrait avoir moins de contraintes naturelles et elle devrait être préservée au fil du 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'un autre côté, une autre réalité est qu'il est difficile de prévoir toutes les ressources et leurs aspects qui seraient consommés via l'API. Heureusement, il n'est pas nécessaire de concevoir l'intégralité de l'API qui sera utilisée jusqu'à Apocalypse . Il suffit de définir correctement tous les points d'extrémité de ressource et le schéma d'adressage de chaque ressource et instance de ressource.
Au fil du temps, vous devrez peut-être ajouter de nouvelles ressources et de nouveaux attributs à chaque ressource particulière, mais la méthode que les utilisateurs d'API suivent pour accéder à des ressources particulières ne devrait pas changer une fois qu'un schéma d'adressage de 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 d'API antérieures (ils doivent continuer à fonctionner pour que les clients d'API qui ont travaillé sans intervention humaine puissent continuer à fonctionner). comme ça).
De plus, étant donné que l'intégration de la version de l'API dans l'URI perturberait le concept d' hypermédia en tant que moteur de l'état de l'application (indiqué dans la thèse de doctorat de Roy T. Fieldings) en ayant une adresse de ressource / URI qui changerait avec le temps, je conclurais que l' API les versions ne doivent pas être conservées pendant longtemps dans les URI de ressources, ce qui signifie que les URI de ressources sur lesquels les utilisateurs d'API peuvent compter doivent être des permaliens .
Bien sûr, il est possible d'incorporer la version d'API dans l'URI de base, mais uniquement pour des utilisations raisonnables et restreintes comme le débogage d'un client d'API qui fonctionne avec la nouvelle version d'API. Ces API versionnées devraient être limitées dans le temps et disponibles pour des groupes limités d'utilisateurs d'API (comme pendant les versions bêta fermées) uniquement. Sinon, vous vous engagez là où vous ne devriez pas.
Quelques réflexions sur la maintenance des versions d'API qui ont une date d'expiration. Toutes les plates-formes / langages de programmation couramment utilisés pour implémenter des services Web (Java, .NET, PHP, Perl, Rails, etc.) permettent de lier facilement les points d'extrémité de service Web à un URI de base. De cette façon, il est facile de rassembler et de conserver une collection de fichiers / classes / méthodes séparées entre les différentes versions d'API .
À partir du POV des utilisateurs d'API, il est également plus facile de travailler avec une version d'API particulière et de s'y lier lorsque cela est évident, mais uniquement pour une durée limitée, c'est-à-dire pendant le développement.
À partir du POV du mainteneur d'API, il est plus facile de maintenir différentes versions d'API en parallèle en utilisant des systèmes de contrôle de source qui fonctionnent principalement sur des fichiers comme la plus petite unité de version (code source).
Cependant, avec les versions d'API clairement visibles dans l'URI, il y a une mise en garde: on pourrait également s'opposer à cette approche car l' historique des API devient visible / apparenté dans la conception de l'URI et est donc sujet à des changements au fil du temps, ce qui va à l'encontre des directives de REST. Je suis d'accord!
La façon de contourner cette objection raisonnable est d'implémenter la dernière version d'API sous l'URI de base d'API sans version. Dans ce cas, les développeurs de clients API peuvent choisir:
développer contre la dernière (en s'engageant à maintenir l'application en la protégeant des éventuels changements d'API qui pourraient casser leur client d'API mal conçu ).
se lier à une version spécifique de l'API (qui devient apparente) mais uniquement pour une durée limitée
Par exemple, si l'API v3.0 est la dernière version d'API, les deux suivantes doivent être des alias (c'est-à-dire se comporter de manière identique pour toutes les demandes d'API):
http: // shonzilla / api / clients / 1234
http: // shonzilla / api /v3.0 / clients / 1234
http: // shonzilla / api / v3 / customers / 1234
De plus, les clients d'API qui tentent toujours de pointer vers l' ancienne API doivent être informés de l'utilisation de la dernière version d'API précédente, si la version d'API qu'ils utilisent est obsolète ou n'est plus prise en charge . Donc, accéder à l'un des URI obsolètes comme 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 codes d'état HTTP 30x qui indiquent la redirection utilisée en conjonction avec l' Location
en-tête HTTP qui redirige vers la version appropriée de l'URI de ressource qui reste celle-ci:
http: // shonzilla / api / clients / 1234
Il existe au moins deux codes d'état HTTP de redirection appropriés pour les scénarios de version d'API:
301 Déplacé de manière permanente indiquant que la ressource avec un URI demandé est déplacée de manière permanente vers un autre URI (qui doit être un permalien d'instance de ressource qui ne contient pas d'informations de version d'API). Ce code d'état peut être utilisé pour indiquer une version d'API obsolète / non prise en charge, informant le client API qu'un URI de ressource versionné a été remplacé par un permalien de ressource .
302 Trouvé indiquant que la ressource demandée se trouve temporairement à un autre emplacement, 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 dire aux clients de continuer à l'utiliser (c'est-à-dire le permaliens).
d'autres scénarios peuvent être trouvés dans le chapitre Redirection 3xx de la spécification HTTP 1.1