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 seinFoo
. Wie ich oben geschrieben habe, ist es jedoch möglich, dass mehrereFoo
s dasselbe teilenBar
. Es sollte möglich sein, eineFoo
ohneBar
zugehörige zu erstellen , daher denke ich nicht,Bar
dass als Eltern behandelt werden sollte.Antworten:
Eine REST-API der Stufe 3 würde Ihnen einen
Foo
und auch einen Link zurückgeben, der den entsprechenden Wert angibtBar
.Sie können Ihrer API dann eine Drilldown-Funktion hinzufügen, die die Navigation von Links ermöglicht.
Die Drilldown-Funktion würde sich vor den APIs befinden und Antworten abfangen. Es würde die Drilldown-Anrufe tätigen und die Details eingeben, bevor die Antwort an den Anrufer zurückgegeben wird.
Dies ist eine ziemlich häufige Sache in Level 3 REST, da es die Client / Server-Chattiness über langsame http stark reduziert. Das Unternehmen, für das ich arbeite, erstellt eine REST-API der Stufe 3 mit genau dieser Funktion.
Update: Für was es wert ist, hier ist, wie es in JSON aussehen könnte. So würde unsere API es strukturieren. Beachten Sie, dass Sie Ihre Drilldowns verschachteln können, um Links von Links usw. zu ziehen.
quelle
links
Array. Jeder Eintrag ist ein Verknüpfungsobjekt mit einemrel
und einemuri
Feld (ähnlich Ihrem XML-Beispiel). Sollte ich jedem Linkobjekt (z. B.data
) nur ein drittes Feld hinzufügen ? Gibt es einen Standard?Wenn 95% aller Abfragen
Foo
so gut wie wollenBar
, geben Sie es einfach innerhalb desFoo
Objekts zurück, wenn Sie eine anfordernFoo
. Fügen Sie einfach eine Eigenschaftbar
(oder einen anderen Begriff für die Beziehung) hinzu und platzieren Sie dasBar
Objekt dort. Wenn die Beziehung nicht existiert, verwenden Sie null.Ich denke du überdenkst das :)
quelle
Foo
, und da jedeBar
sehr viel Speicherplatz hat (etwa 3x-4x so groß wieFoo
), möchte ich keine zurückgeben,Bar
wenn ein Client dies nicht explizit anfordert.