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é à unFoo
. Cependant, comme je l'ai écrit ci-dessus, il est possible que plusieursFoo
s partagent la même choseBar
. Il devrait être possible de créer unFoo
sansBar
associé, donc je ne pense pas que celaBar
devrait être traité comme parent.Réponses:
Une API REST de niveau 3 vous renverrait un
Foo
et également un lien indiquant le lienBar
.Vous pouvez ensuite ajouter une fonctionnalité "drill down" à votre API qui permet la navigation des liens;
La fonction d'exploration descendante se situerait devant les API et intercepterait les réponses. Il effectuerait les appels vers le bas et remplirait les détails avant de remettre la réponse à l'appelant.
C'est une chose assez courante dans le REST de niveau 3 car cela réduit considérablement la conversation client / serveur sur http lent. L'entreprise pour laquelle je travaille produit une API REST de niveau 3 avec exactement cette fonctionnalité.
Mise à jour: pour ce que cela vaut, voici à quoi cela pourrait ressembler dans JSON. C'est ainsi que notre API le structurerait. Notez que vous pouvez imbriquer vos explorations pour extraire des liens de liens, etc.
la source
links
tableau, chaque entrée est un objet lien avec unrel
et unuri
champ (similaire à votre exemple xml). Dois-je simplement ajouter un troisième champ à chaque objet lien (par exempledata
)? Existe-t-il une norme?Si 95% de toutes les requêtes veulent
Foo
ainsi queBar
, puis il suffit de retourner à l' intérieur de l'Foo
objet lorsque vous demandez unFoo
. Ajoutez simplement une propriétébar
(ou un autre terme pour la relation) et placez-y l'Bar
objet. Si la relation n'existe pas, utilisez null.Je pense que vous y pensez trop :)
la source
Foo
, et comme chacuneBar
est assez énorme en mémoire (environ 3x-4x la taille deFoo
), je ne veux pas retourner unBar
si un client ne le demande pas explicitement.