Je suis en train de créer une API REST et actuellement, je rencontre le problème suivant:
Foo
est la première ressource. Les opérations CRUD peuvent être appliquées via l'/foo/
URI.Bar
est la deuxième ressource. Les opérations CRUD peuvent être appliquées via l'/bar/
URI.- Tout
Foo
est associé à zéro ou unBar
. La raison pour laquelle je ne traite pasBar
comme une sous-ressource deFoo
est parce que la mêmeBar
instance peut être partagée entre plusieurs mutuelsFoo
. J'ai donc pensé qu'il valait mieux y accéder via un URI indépendant au lieu de/foo/[id]/bar
.
Mon problème est que dans un nombre important de cas, les clients qui demandent une Foo
instance sont également intéressés par l' Bar
instance associée . Actuellement, cela signifie qu'ils doivent effectuer deux requêtes au lieu d'une. Je veux présenter un moyen qui permet d'obtenir les deux objets avec une seule requête, mais je ne sais pas comment modéliser l'API pour le faire. Ce que j'ai trouvé jusqu'à présent:
- Je pourrais introduire un paramètre de requête similaire à ceci:
/foo/[id]?include_bar=true
. Le problème avec cette approche est que la représentation des ressources (par exemple la structure JSON) de la réponse devrait avoir un aspect différent (par exemple, un conteneur tel qu'au{ foo: ..., bar: ... }
lieu d'être juste un sérialiséFoo
), ce qui rend leFoo
point de terminaison de la ressource "hétérogène". Je ne pense pas que ce soit une bonne chose. Lors de la requête/foo
, les clients doivent toujours obtenir la même représentation des ressources (structure), quels que soient les paramètres de requête. - Une autre idée consiste à introduire un nouveau point de terminaison en lecture seule, par exemple
/fooandbar/[foo-id]
. Dans ce cas, ce n'est pas un problème de retourner une représentation comme{ foo: ..., bar: ... }
, car alors c'est juste la représentation "officielle" de lafooandbar
ressource. Cependant, je ne sais pas si un tel point de terminaison d'aide est vraiment RESTful (c'est pourquoi j'ai écrit "can" dans le titre de la question. Bien sûr, c'est techniquement possible, mais je ne sais pas si c'est une bonne idée).
Qu'est-ce que tu penses? Y a-t-il d'autres possibilités?
Bar
ne peut exister sans être associé à un Foo
. Cependant, comme je l'ai écrit ci-dessus, il est possible que plusieurs Foo
s partagent la même chose Bar
. Il devrait être possible de créer un Foo
sans Bar
associé, donc je ne pense pas que cela Bar
devrait être traité comme parent.