La manière fondamentale de penser à ce sujet est la suivante:
Un URI est un identificateur de ressource qui identifie de manière unique une instance spécifique d'un TYPE de ressource. Comme tout le reste de la vie, chaque objet (qui est une instance d'un certain type) a un ensemble d'attributs qui sont soit invariants dans le temps, soit temporels.
Dans l'exemple ci-dessus, une voiture est un objet très tangible qui a des attributs comme la marque, le modèle et le NIV - qui ne change jamais, et la couleur, la suspension, etc. qui peuvent changer avec le temps. Donc, si nous encodons l'URI avec des attributs qui peuvent changer dans le temps (temporel), nous pouvons nous retrouver avec plusieurs URI pour le même objet:
GET /cars/honda/civic/coupe/{vin}/{color=red}
Et des années plus tard, si la couleur de cette même voiture est changée en noir:
GET /cars/honda/civic/coupe/{vin}/{color=black}
Notez que l'instance de voiture elle-même (l'objet) n'a pas changé - c'est juste la couleur qui a changé. Avoir plusieurs URI pointant vers la même instance d'objet vous obligera à créer plusieurs gestionnaires d'URI - ce n'est pas une conception efficace, et n'est bien sûr pas intuitive.
Par conséquent, l'URI ne doit être constitué que de parties qui ne changeront jamais et continueront à identifier de manière unique cette ressource tout au long de sa durée de vie. Tout ce qui peut changer doit être réservé aux paramètres de requête, en tant que tels:
GET /cars/honda/civic/coupe/{vin}?color={black}
En bout de ligne, pensez au polymorphisme.