La forma fundamental de pensar sobre este tema es la siguiente:
Un URI es un identificador de recurso que identifica de forma exclusiva una instancia específica de un TIPO de recurso. Como todo lo demás en la vida, cada objeto (que es una instancia de algún tipo), tiene un conjunto de atributos que son temporales o temporales.
En el ejemplo anterior, un automóvil es un objeto muy tangible que tiene atributos como marca, modelo y VIN, que nunca cambia, y color, suspensión, etc. que pueden cambiar con el tiempo. Entonces, si codificamos el URI con atributos que pueden cambiar con el tiempo (temporal), podemos terminar con múltiples URI para el mismo objeto:
GET /cars/honda/civic/coupe/{vin}/{color=red}
Y años después, si el color de este mismo automóvil cambia a negro:
GET /cars/honda/civic/coupe/{vin}/{color=black}
Tenga en cuenta que la instancia del automóvil en sí (el objeto) no ha cambiado, solo cambió el color. Tener múltiples URI apuntando a la misma instancia de objeto lo obligará a crear múltiples manejadores de URI; este no es un diseño eficiente y, por supuesto, no es intuitivo.
Por lo tanto, el URI solo debe constar de partes que nunca cambiarán y continuarán identificando de manera única ese recurso durante toda su vida útil. Todo lo que pueda cambiar debe reservarse para los parámetros de consulta, como tal:
GET /cars/honda/civic/coupe/{vin}?color={black}
En pocas palabras: piense en el polimorfismo.