Die grundlegende Art, über dieses Thema nachzudenken, ist wie folgt:
Ein URI ist eine Ressourcenkennung, die eine bestimmte Instanz eines Ressourcentyps eindeutig identifiziert. Wie alles andere im Leben hat jedes Objekt (das eine Instanz eines Typs ist) eine Reihe von Attributen, die entweder zeitinvariant oder zeitlich sind.
Im obigen Beispiel ist ein Auto ein sehr greifbares Objekt mit Attributen wie Marke, Modell und Fahrgestellnummer, die sich nie ändern, sowie Farbe, Federung usw., die sich im Laufe der Zeit ändern können. Wenn wir also den URI mit Attributen codieren, die sich im Laufe der Zeit (zeitlich) ändern können, erhalten wir möglicherweise mehrere URIs für dasselbe Objekt:
GET /cars/honda/civic/coupe/{vin}/{color=red}
Und Jahre später, wenn die Farbe dieses Autos in Schwarz geändert wird:
GET /cars/honda/civic/coupe/{vin}/{color=black}
Beachten Sie, dass sich die Autoinstanz selbst (das Objekt) nicht geändert hat - es ist nur die Farbe, die sich geändert hat. Wenn mehrere URIs auf dieselbe Objektinstanz verweisen, müssen Sie mehrere URI-Handler erstellen. Dies ist kein effizientes Design und natürlich nicht intuitiv.
Daher sollte der URI nur aus Teilen bestehen, die sich niemals ändern und diese Ressource während ihrer gesamten Lebensdauer eindeutig identifizieren. Alles, was sich ändern kann, sollte als solches für Abfrageparameter reserviert werden:
GET /cars/honda/civic/coupe/{vin}?color={black}
Fazit: Denken Sie an Polymorphismus.