Dropwizard plusieurs versions de l'API Rest
-
21-12-2019 - |
Question
Actuellement, je conçois comment gérer le routage dans une API de repos versionnée où la version ne fait pas partie de l'URL, mais est envoyée via une variable d'en-tête.
J'ai considéré/vu des choses comme :
Réécriture de l'URL en fonction de la variable d'en-tête, c'est-à-direla demande /orders {X-Media-Type: v1}
réécrirait dans /v1/orders et nous pourrions alors avoir un @Path("/v1/orders") OrderV1Resource {}
et donc faire la v2 serait trivial @Path("/v2/orders") OrderV2Resource {}
.(ma première préférence) Comment utiliser un filtre de servlet en Java pour modifier l'URL d'une requête de servlet entrante ?
Avoir un célibataire @Path("/orders") OrderResource {}
où chacune de ses méthodes a un HeaderParam injecté et je pourrais vérifier la variable d'en-tête, puis décider quelle implémentation de l'API Order je voulais utiliser (ce qui me semble très compliqué)
// pseudo-java code
@Path("/orders")
OrderResource {
OrderV1Impl v1Impl;
OrderV2Impl v2Impl;
@GET
public List<Order> findAll(@HeaderParam header) {
version = header.get("accepts")
if(version.equals("v1")) { return v1Impl.findAll() }
else if(version.equals("v2")) { return v2Impl.findAll() }
return error
}
}
Ou simplement les regrouper dans des JARS séparés et demander à un service d'examiner l'en-tête et de l'acheminer vers la version correcte.(cela semble logique si l'application devient vraiment volumineuse)
La solution
J'ai fini par transmettre la version via un en-tête, puis je l'ai utilisé pour acheminer la ressource souhaitée via un javax.servlet.Filter
.
Exemple d'en-tête Accept :Accept: application/vnd.datarank.v1+json