Quelle est la manière appropriée d'imbriquer des ressources dans le modèle REST?

14

Je conçois une API de service REST et je suis resté bloqué sur la bonne façon d'imbriquer les ressources.

Ressources: partenaires, tickets, paramètres

Connexions entre les ressources:

  • partenaire a de nombreux billets,
  • partenaire a défini des paramètres,

Logique Bussines:

  • vous pouvez répertorier tous les partenaires en tant qu'utilisateur anonyme,
  • vous pouvez ajouter un nouveau ticket au partenaire spécifié en tant qu'utilisateur anonyme,
  • seul partenaire peut lister ses billets,
  • seul partenaire peut modifier ses billets,
  • seul le partenaire peut répertorier les paramètres,
  • seul le partenaire peut modifier les paramètres,

Ce que j'ai fait jusqu'à présent:

Ressources partenaires

GET / partners - liste tous les partenaires
GET / partners /: id - affiche les détails du partenaire spécifié par: paramètre id
GET / partners /: partner_id / tickets - liste des tickets du partenaire
GET / partners /: partner_id / tickets /: id - détails du ticket du partenaire spécifié
POST / partners /: partner_id / tickets - enregistre le nouveau ticket
PUT / partners /: partner_id / tickets /: id - met à jour le ticket spécifié par: id paramètre
GET / partners /: partner_id / settings - liste des paramètres du partenaire
PUT / partners /: partner_id / settings - met à jour les paramètres du partenaire

Problème / Question

Serait-ce un bon moyen de diviser les ressources imbriquées (tickets, paramètres) pour séparer les ressources ou les dupliquer en tant que ressources distinctes?

Par exemple

GET / tickets /: id
POST / tickets
PUT / tickets /: id

GET / paramètres
PUT / paramètres

Przemek
la source

Réponses:

8

HATEOAS :

GET /partners/:partner_id/tickets - liste des tickets du partenaire, c'est-à-dire retourne une liste d'URI, probablement de la forme /tickets/:id

GET /partners/:partner_id/tickets/:id - pas besoin

POST /partners/:partner_id/tickets - crée un ticket et s'associe au partenaire, renvoie un 201 avec le nouvel URI, du formulaire /tickets/:id

Javier
la source
2
Maintenant je comprends mieux. Merci beaucoup :) Mais qu'en est-il des performances? Supposons cette situation: vous souhaitez créer une liste de billets avec de brèves informations. Vous devez demander la liste des billets pour le partenaire et ensuite demander chaque billet individuellement. Ai-je raison?
Przemek
Hé bien oui. ou vous pouvez faire en sorte que la /partners/:partner_id/ticketsliste inclue des données utiles pour chaque ticket, pas seulement l'URI canonique du ticket. Par exemple, dans JSON [{href='/tickets/12',value=10,due='2013-08-13'},{href='/tickets/18',value=7,due='2013-09-02'}], le client pourrait afficher immédiatement une table et obtenir / mettre les ressources de ticket complètes pour une manipulation supplémentaire.
Javier
OK, c'est clair.
Przemek
BTW. Pour / partners /: partner_id / tickets, les documents doivent-ils être fournis dans la section ressources partenaire ou ticket?
Przemek du
@Javier et DELETE? DELETE /tickets/:id?
Mengdi Gao