Ich bin gerade dabei, eine REST-API zu erstellen, und derzeit tritt das folgende Problem auf:
Foo
ist die erste Ressource. CRUD-Operationen können über den/foo/
URI angewendet werden .Bar
ist die zweite Ressource. CRUD-Operationen können über den/bar/
URI angewendet werden .- Jeder
Foo
ist mit Null oder Eins verbundenBar
. Der Grund, warum ich nichtBar
als Unterressource von behandle,Foo
ist, dass dieselbeBar
Instanz von mehreren geteilt werden kannFoo
. Also dachte ich, es ist besser, statt über eine unabhängige URI darauf zuzugreifen/foo/[id]/bar
.
Mein Problem ist, dass in einer erheblichen Anzahl von Fällen auch Clients, die nach einer Foo
Instanz fragen, an der zugehörigen Bar
Instanz interessiert sind . Derzeit bedeutet dies, dass sie zwei Abfragen anstelle von einer ausführen müssen. Ich möchte eine Methode vorstellen, mit der beide Objekte mit einer einzigen Abfrage abgerufen werden können, aber ich weiß nicht, wie ich die API dafür modellieren soll. Was ich mir bisher ausgedacht habe:
- Ich könnte einen ähnlichen Abfrageparameter einführen :
/foo/[id]?include_bar=true
. Das Problem bei diesem Ansatz besteht darin, dass die Ressourcendarstellung (z. B. die JSON-Struktur) der Antwort anders aussehen muss (z. B. ein Container wie z. B.{ foo: ..., bar: ... }
nur ein serialisierterFoo
), wodurch derFoo
Ressourcenendpunkt "heterogen" wird. Ich denke nicht, dass das eine gute Sache ist. Bei der Abfrage/foo
sollten Clients unabhängig von den Abfrageparametern immer dieselbe Ressourcendarstellung (Struktur) erhalten. - Eine andere Idee ist die Einführung eines neuen schreibgeschützten Endpunkts, z
/fooandbar/[foo-id]
. In diesem Fall ist es kein Problem, eine Darstellung wie zurückzugeben{ foo: ..., bar: ... }
, da es sich dann nur um die "offizielle" Darstellung derfooandbar
Ressource handelt. Ich weiß jedoch nicht, ob ein solcher Helfer-Endpunkt wirklich RESTful ist (deshalb habe ich im Titel der Frage "can" geschrieben. Natürlich ist es technisch möglich, aber ich weiß nicht, ob es eine gute Idee ist).
Was denkst du? Gibt es noch andere Möglichkeiten?
Bar
kann nicht existieren, ohne mit a verbunden zu sein Foo
. Wie ich oben geschrieben habe, ist es jedoch möglich, dass mehrere Foo
s dasselbe teilen Bar
. Es sollte möglich sein, eine Foo
ohne Bar
zugehörige zu erstellen , daher denke ich nicht, Bar
dass als Eltern behandelt werden sollte.