Основной способ думать об этом предмете следующий:
URI - это идентификатор ресурса, который однозначно идентифицирует конкретный экземпляр ТИПА ресурса. Как и все остальное в жизни, каждый объект (который является экземпляром какого-либо типа) имеет набор атрибутов, которые либо не зависят от времени, либо являются временными.
В приведенном выше примере автомобиль - это очень осязаемый объект, у которого есть такие атрибуты, как марка, модель и VIN, которые никогда не меняются, а также цвет, подвеска и т. Д., Которые могут меняться со временем. Поэтому, если мы закодируем URI с атрибутами, которые могут изменяться со временем (временными), мы можем получить несколько URI для одного и того же объекта:
GET /cars/honda/civic/coupe/{vin}/{color=red}
А годы спустя, если цвет этой самой машины поменять на черный:
GET /cars/honda/civic/coupe/{vin}/{color=black}
Обратите внимание, что сам экземпляр автомобиля (объект) не изменился - изменился только цвет. Наличие нескольких URI, указывающих на один и тот же экземпляр объекта, заставит вас создать несколько обработчиков URI - это неэффективный дизайн и, конечно, не интуитивно понятный.
Следовательно, URI должен состоять только из частей, которые никогда не изменятся и будут однозначно идентифицировать этот ресурс на протяжении всего его срока службы. Все, что может измениться, следует зарезервировать для параметров запроса как таковых:
GET /cars/honda/civic/coupe/{vin}?color={black}
Итог - подумайте о полиморфизме.