Wie können Ressourcen im REST-Modell ordnungsgemäß verschachtelt werden?

14

Ich entwerfe eine REST-API des Dienstes und bin auf dem richtigen Weg zum Verschachteln von Ressourcen hängen geblieben.

Ressourcen: Partner, Tickets, Einstellungen

Verbindungen zwischen Ressourcen:

  • Partner hat viele Tickets,
  • Partner hat eine Reihe von Einstellungen,

Geschäftslogik:

  • Sie können alle Partner als anonymen Benutzer auflisten,
  • Sie können dem angegebenen Partner ein neues Ticket als anonymer Benutzer hinzufügen.
  • Nur der Partner kann seine Tickets auflisten.
  • Nur der Partner kann seine Tickets ändern.
  • Nur Partner können Einstellungen auflisten.
  • Nur der Partner kann die Einstellungen ändern.

Was ich bis jetzt gemacht habe:

Partnerressourcen

GET / partners - listet alle Partner auf
GET / partners /: id - zeigt Details des Partners an, angegeben durch: id-Parameter
GET / partners /: partner_id / tickets - listet Tickets des Partners auf
GET / partners /: partner_id / tickets /: id - details des angegebenen Partnertickets
POST / partners /: partner_id / tickets - speichert neues Ticket
PUT / partners /: partner_id / tickets /: id - aktualisiert das Ticket, angegeben durch: id-Parameter
GET / partners /: partner_id / settings - listet die Partnereinstellungen
PUT auf / partners /: partner_id / settings - Aktualisiert die Einstellungen des Partners

Problem / Frage

Wäre es richtig, verschachtelte Ressourcen (Tickets, Einstellungen) zu teilen, um Ressourcen zu trennen, oder sie als separate Ressourcen zu duplizieren?

Z.B

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

GET / settings
PUT / settings

Przemek
quelle

Antworten:

8

HATEOAS :

GET /partners/:partner_id/tickets - Liste der Tickets des Partners, dh eine Liste der URIs, wahrscheinlich in der Form /tickets/:id

GET /partners/:partner_id/tickets/:id - nicht benötigt

POST /partners/:partner_id/tickets - Erstellt ein Ticket und verbindet sich mit dem Partner. Gibt eine 201 mit der neuen URI des Formulars zurück /tickets/:id

Javier
quelle
2
Jetzt verstehe ich mehr. Vielen Dank :) Aber was ist mit der Leistung? Nehmen wir diese Situation an: Sie möchten eine Liste von Tickets mit einigen Kurzinformationen erstellen. Sie müssen eine Liste der Tickets für den Partner anfordern und danach jedes Ticket einzeln anfordern. Habe ich recht?
Przemek
Nun ja. Sie können auch festlegen, dass die /partners/:partner_id/ticketsListe einige nützliche Daten für jedes Ticket enthält, nicht nur die kanonische URI des Tickets. In JSON könnte dies beispielsweise der Fall sein [{href='/tickets/12',value=10,due='2013-08-13'},{href='/tickets/18',value=7,due='2013-09-02'}], sodass der Client sofort eine Tabelle anzeigen und die vollständigen Ticketressourcen für zusätzliche Manipulationen abrufen / eingeben kann.
Javier
OK Es ist klar.
Przemek
BTW. Für / partners /: partner_id / tickets sollten Dokumente im Bereich Partner- oder Ticketressourcen bereitgestellt werden?
Przemek
@Javier was ist mit DELETE? DELETE /tickets/:id?
Mengdi Gao