2016-10-21 1 views
2

alors je suis les modèles User & Poll où un utilisateur peut créer de nombreux sondages (donc nous avons eu 1: n relation ici) et la table de jointure Participant en tant qu'utilisateur peut faire partie d'un grand nombre sondages et un sondage peuvent avoir de nombreux utilisateurs.URL REST conception pour plusieurs à plusieurs

J'ai besoin de définir deux points d'extrémité REST: One pour obtenir une liste de sondages créés par un utilisateur et un pour obtenir une liste des sondages où un utilisateur est un participant.

Pour le premier point, je définis:

GET /users/:id/polls 

... ce qui est de la manière habituelle de définir 1: n relations. Mais pour le second point de terminaison, je suis complètement désemparé comment cela pourrait ressembler à REST. J'ai essentiellement l'utilisateur et j'ai besoin de tous les sondages où l'utilisateur est un participant. Je veux faire avancer les choses et ne veulent pas perdre trop de temps, donc je suis venu avec cette abomination:

GET /users/:id/polls/participation 

Quelqu'un at-il une idée saine d'esprit comment cela peut être conçu? Est-il même possible de mapper ceci en un seul appel avec REST?

Répondre

1

Je recommanderais de faire de polls une ressource de premier niveau. Vous pouvez ensuite prendre en charge

GET /polls?createdBy={userId} 
GET /polls?participant={userId} 

Vous pouvez ajouter d'autres paramètres de requête si nécessaire. Une autre alternative consiste à avoir une ressource distincte, poll-participants, qui contient le mappage.

GET /poll-participants?creator={userId} 
GET /poll-participants?particpant={userId} 

Dans ce cas, vous obtiendrez une ressource qui a une liste d'objets de mappage. Ils peuvent contenir l'utilisateur entier et interroger dans chacun d'entre eux, ou ils peuvent avoir des liens que vous devez suivre pour obtenir l'utilisateur complet et interroger. Cela fonctionne mieux lorsque l'utilisateur et le sondage sont susceptibles d'être mis en cache.

+0

Donc, dans l'exemple un, vous utiliseriez le paramètre 'participant' pour' Poll', bien que ce ne soit qu'une propriété virtuelle? Je vois que 'created_by' est légitime car c'est une vraie propriété sur' Poll'. – codepushr

+1

@codepushr Oui. Il n'existe aucune règle indiquant que seules les propriétés d'une ressource peuvent être interrogées. –

+0

@codepushr Désolé, je veux clarifier quelque chose. Les participants sont les propriétés de la * ressource *. Ils ne sont pas des propriétés de la * représentation * que vous fournissez à vos clients. Et vos ressources et vos représentations sont des entités conceptuelles totalement séparées du modèle de données pratique pour le stockage de votre base de données, de la même manière que vous ne limitez pas la conception de votre interface utilisateur pour la mapper directement à votre base de données. –

1

Eh bien, comme je l'ai eu votre question, vous avez besoin de construire des données simples. Je peux vous suggérer d'ajouter le paramètre get comme GET/users /: id/poll? Participation = true. Cela peut se référer à votre modèle et rester simple à comprendre.

+0

Les paramètres de requête dans REST ne représentent-ils pas généralement les attributs réels d'un modèle? 'Poll' n'a pas vraiment de" participation ", je viens juste de le faire. La relation est modélisée dans la table de jointure. – codepushr

+0

Tant pis! Eric Stein a suggéré que les propriétés et les requêtes virtuelles conviennent aux ressources. – codepushr