Questa domanda riguarda la progettazione ottimale dell'API REST e un problema che sto affrontando per scegliere tra le risorse nidificate e le raccolte di livello root.Progettazione API REST: raccolta nidificata e nuova radice
Per dimostrare il concetto, supponiamo di disporre di raccolte City
, Business
e Employees
. Un'API tipica può essere costruita come segue. Immagina che ABC, X7N e WWW siano chiavi, ad es. GUID:
GET Api/City/ABC/Businesses (returns all Businesses in City ABC)
GET Api/City/ABC/Businesses/X7N (returns business X7N)
GET Api/City/ABC/Businesses/X7N/Employees (returns all employees at business X7N)
PUT Api/City/ABC/Businesses/X7N/Employees/WWW (updates employee WWW)
Ciò appare pulita perché segue la struttura di dominio originale - business sono in una città, ei dipendenti sono a un business. I singoli articoli sono accessibili tramite chiave sotto la raccolta (ad esempio, ../Businesses
restituisce tutte le attività commerciali, mentre ../Businesses/X7N
restituisce l'attività individuale).
Ecco ciò che il consumatore API deve essere in grado di fare:
- Get imprese in una città
(GET Api/City/ABC/Businesses)
- Ottenere tutti i dipendenti di un'azienda
(GET Api/City/ABC/Businesses/X7N/Employees)
- Aggiornare le informazioni di singolo dipendente
(PUT Api/City/ABC/Businesses/X7N/Employees/WWW)
Quella seconda e terza chiamata, pur sembrando essere nel posto giusto, usano molti parametri che sono in realtà non validi Essary.
- Per ottenere dipendenti in un'azienda, l'unico parametro necessario è la chiave dell'azienda (
X7N
). - Per aggiornare un singolo dipendente, l'unico parametro aveva bisogno la chiave del dipendente (
WWW
)
Nulla nel codice backend richiede informazioni non chiave per cercare il business o aggiornare il dipendente. Così, invece, i seguenti punti finali appaiono meglio:
GET Api/City/ABC/Businesses (returns all Businesses in City ABC)
GET Api/Businesses/X7N (returns business X7N)
GET Api/Businesses/X7N/Employees (returns all employees at business X7N)
PUT Api/Employees/WWW (updates employee WWW)
Come potete vedere, ho creato un nuovo radice per le imprese e dipendenti, anche se dal punto di vista del dominio sono un sub/sub-sub -collezione.
Nessuna soluzione mi sembra molto pulita.
- Il primo esempio chiede informazioni non necessarie, ma è strutturato in modo che appare "naturale" al consumatore (singoli elementi da una raccolta sono recuperati mediante foglie inferiori)
- Il secondo esempio richiede solo necessario informazioni, ma non è strutturato in modo "naturale" - le sottoraccolte sono accessibili tramite le radici
- La singola radice dipendente non funzionerebbe quando si aggiunge un nuovo dipendente, poiché è necessario sapere a quale azienda aggiungere il dipendente, il che significa quella chiamata dovrebbe almeno risiedere sotto la radice aziendale, come ad esempio
POST Api/Businesses/X7N7/Employees
, il che rende tutto ancora più confuso.
C'è un detergente, una terza via a cui non sto pensando?