J'ai jeté un coup d'œil à Pratiques recommandées pour la versioning des API ?, mais je ne suis pas tout à fait convaincu de la réponse, donc je remets en question la partie sur la version avec un exemple plus spécifique. J'ai deux URI (une avec la version comme partie de l'URI et une sans) :
http://xxxx/v1/user/123 -> solution privilégiée dans le fil de discussion
http://xxxx/user/123
J'ai des doutes quant à savoir si le premier lien exprime l'idée de REST. Je trouve http://xxxx/v1/user/123
déroutant car cela suggère qu'il y aura une version d'API supérieure un jour comme http://xxxx/v2/user/123
. Mais cela n'a pas de sens en termes de REST, la version de l'API elle-même est HTTP 1.0 ou 1.1, qui est déjà envoyée dans la requête HTTP. Cette vue centrique des ressources REST diffère beaucoup des autres API comme SOAP ou les interfaces Java (où il est courant d'avoir des versions d'API dans les noms qualifiés).
En REST, la seule chose où la versioning a du sens est la représentation de cette ressource (par exemple, de nouveaux champs sont ajoutés ou supprimés). Ce versioning fait partie de la négociation de contenu comme :
http://xxx/user/123 + En-tête HTTP 'Accept' -> Négociation de contenu via l'en-tête
http://xxx/user/123?v=1 -> pour les liens permanents/hyperliens
On pourrait aussi arguer que cette négociation de contenu par version pourrait faire partie de l'URI à l'intérieur du chemin, mais je trouve cela contre-intuitif, car vous pourriez vous retrouver avec des URI différentes pour la même ressource et devoir gérer des redirections à un moment donné.
Pour résumer : Dans les URI REST, il n'y a pas de versioning de l'API, seulement du versioning de la représentation de la ressource. Les informations de version de la représentation relèvent de la négociation de contenu (comme queryParam ou l'en-tête HTTP 'Accept').
Qu'en pensez-vous ? Sur quels points seriez-vous en désaccord/d'accord ?
1 votes
Just one little thing to add. the only showstopper to me and to use the ...v1/ style is, when you haven't got the load-balancing under control and can't define directions to the app-servers on HTTP header basis on the frontmachines (-> content-negotiation is part of the HTTP-header). Often the standard is to use the URL path. and in the web-frameworks I can think of it is difficult to define the request-mapping endpoints inside controller on HTTP-header basis instead of the path.