Фундаментальний спосіб думати з цього приводу такий:
URI - це ідентифікатор ресурсу, який однозначно ідентифікує конкретний екземпляр ресурсу TYPE. Як і все в житті, кожен об'єкт (який є примірником якогось типу) має набір атрибутів, які є інваріантними або часовими.
У наведеному вище прикладі автомобіль - це дуже відчутний об’єкт, який має такі атрибути, як марка, модель та 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}
Підсумок - думайте про поліморфізм.