Jaki jest właściwy sposób zagnieżdżania zasobów w modelu REST?

14

Projektuję interfejs API usługi REST i utknąłem na właściwej drodze do zagnieżdżania zasobów.

Zasoby: partnerzy, bilety, ustawienia

Połączenia między zasobami:

  • partner ma wiele biletów,
  • partner ma ustawione ustawienia,

Logika biznesowa:

  • możesz wymienić wszystkich partnerów jako anonimowych użytkowników,
  • możesz dodać nowy bilet do określonego partnera jako użytkownik anonimowy,
  • tylko partner może wymienić swoje bilety,
  • tylko partner może modyfikować swoje bilety,
  • tylko partner może wymienić ustawienia,
  • tylko partner może modyfikować ustawienia,

Co robiłem do tej pory:

Zasoby partnerów

GET / partnerzy - lista wszystkich partnerów
GET / partners /: id - pokaż szczegóły partnera określonego przez: id parametr
GET / partners /: partner_id / bilety - lista biletów partnera
GET / partnerzy /: partner_id / bilety /: id - szczegóły biletu określonego partnera
POST / partnerzy /: identyfikator_partnera / bilety - zapisuje nowy bilet
PUT / partnerzy /: identyfikator_partnera / bilety /: id - aktualizuje bilet określony przez: identyfikator parametru
GET / partnerzy /: identyfikator_partnera / ustawienia - ustawienia listy partnera
PUT / partners /: partner_id / settings - zaktualizuj ustawienia partnera

Problem / pytanie

Czy byłby właściwy sposób na dzielenie zagnieżdżonych zasobów (biletów, ustawień) w celu oddzielenia zasobów lub duplikowania ich jako oddzielnych zasobów?

Na przykład

GET / bilety /: id
POST / bilety
PUT / bilety /: id

GET / ustawienia
PUT / ustawienia

Przemek
źródło

Odpowiedzi:

8

HATEOAS :

GET /partners/:partner_id/tickets - lista biletów partnera, to znaczy zwraca listę identyfikatorów URI, prawdopodobnie o formie /tickets/:id

GET /partners/:partner_id/tickets/:id - nie są potrzebne

POST /partners/:partner_id/tickets - tworzy bilet i kojarzy się z partnerem, zwraca 201 z nowym identyfikatorem URI formularza /tickets/:id

Javier
źródło
2
Teraz rozumiem więcej. Wielkie dzięki :) Ale co z wydajnością? Załóżmy, że sytuacja: chcesz stworzyć listę biletów z krótkimi informacjami. Musisz poprosić o listę biletów dla partnera, a następnie indywidualnie dla każdego biletu. Czy mam rację?
Przemek
No tak. lub możesz sprawić, by /partners/:partner_id/ticketslista zawierała przydatne dane dla każdego biletu, a nie tylko kanoniczny identyfikator URI biletu. Na przykład w JSON może być [{href='/tickets/12',value=10,due='2013-08-13'},{href='/tickets/18',value=7,due='2013-09-02'}], więc klient może natychmiast wyświetlić tabelę i GET / PUT pełne zasoby biletów w celu dodatkowej manipulacji.
Javier
OK To jasne.
Przemek
BTW. W przypadku / partners /: partner_id / bilety należy podać dokumenty w części dotyczącej zasobów partnera lub biletu?
Przemek
@Javier co z DELETE? DELETE /tickets/:id?
Mengdi Gao,