Il modo fondamentale di pensare a questo argomento è il seguente:
Un URI è un identificatore di risorsa che identifica in modo univoco un'istanza specifica di un TIPO di risorsa. Come ogni altra cosa nella vita, ogni oggetto (che è un'istanza di qualche tipo), ha un insieme di attributi che sono invarianti nel tempo o temporali.
Nell'esempio sopra, un'auto è un oggetto molto tangibile che ha attributi come marca, modello e VIN - che non cambia mai, e colore, sospensioni ecc. Che possono cambiare nel tempo. Quindi se codifichiamo l'URI con attributi che possono cambiare nel tempo (temporali), potremmo finire con URI multipli per lo stesso oggetto:
GET /cars/honda/civic/coupe/{vin}/{color=red}
E anni dopo, se il colore di questa stessa macchina viene cambiato in nero:
GET /cars/honda/civic/coupe/{vin}/{color=black}
Nota che l'istanza dell'auto stessa (l'oggetto) non è cambiata - è solo il colore che è cambiato. Avere più URI che puntano alla stessa istanza di oggetto ti costringerà a creare più gestori URI: questa non è una progettazione efficiente e ovviamente non è intuitiva.
Pertanto, l'URI dovrebbe essere costituito solo da parti che non cambieranno mai e continuerà a identificare in modo univoco quella risorsa per tutta la sua vita. Tutto ciò che può cambiare dovrebbe essere riservato ai parametri della query, in quanto tale:
GET /cars/honda/civic/coupe/{vin}?color={black}
In conclusione: pensa al polimorfismo.