Podstawowy sposób myślenia na ten temat jest następujący:
URI to identyfikator zasobu, który jednoznacznie identyfikuje określone wystąpienie TYPU zasobu. Jak wszystko inne w życiu, każdy obiekt (który jest instancją pewnego typu) ma zestaw atrybutów, które są albo niezmienne w czasie, albo czasowe.
W powyższym przykładzie samochód jest bardzo namacalnym przedmiotem, który ma takie atrybuty, jak marka, model i VIN - które nigdy się nie zmieniają, a kolor, zawieszenie itp. Mogą się zmieniać w czasie. Więc jeśli zakodujemy URI z atrybutami, które mogą się zmieniać w czasie (czasowo), możemy skończyć z wieloma identyfikatorami URI dla tego samego obiektu:
GET /cars/honda/civic/coupe/{vin}/{color=red}
A po latach, jeśli kolor tego samego samochodu zmieni się na czarny:
GET /cars/honda/civic/coupe/{vin}/{color=black}
Zwróć uwagę, że sama instancja samochodu (obiekt) nie uległa zmianie - zmienił się tylko kolor. Posiadanie wielu identyfikatorów URI wskazujących na tę samą instancję obiektu zmusi Cię do utworzenia wielu programów obsługi URI - nie jest to efektywny projekt i oczywiście nie jest intuicyjny.
Dlatego identyfikator URI powinien składać się tylko z części, które nigdy się nie zmienią i będą nadal jednoznacznie identyfikować ten zasób przez cały okres jego istnienia. Wszystko, co może się zmienić, powinno być zarezerwowane dla parametrów zapytania, takich jak:
GET /cars/honda/civic/coupe/{vin}?color={black}
Konkluzja - pomyśl o polimorfizmie.