Sono nuovo nello sviluppo web lato server e di recente ho letto molto sull'implementazione delle API RESTful. Un aspetto dell'API REST su cui sono ancora bloccato è il modo di strutturare la gerarchia URI che identifica le risorse con cui il client può interagire. In particolare, sono bloccato nel decidere in che modo fare la gerarchia e cosa fare nel caso in cui le risorse siano composte da altri tipi di risorse.Come strutturare la gerarchia delle risorse REST?
Ecco un esempio che si spera mostrerà cosa intendo. Immagina di avere un servizio web che consente agli utenti di acquistare prodotti da altri utenti. Quindi, in questo semplice caso, ci sono due risorse di livello superiore utenti e prodotti. Ecco come ho cominciato a strutturare la gerarchia URI,
Per gli utenti:
/users
/{id}
/location
/about
/name
/seller_rating
/bought
/sold
Per i prodotti:
/products
/{id}
/name
/category
/description
/keywords
/buyer
/seller
In entrambi i casi gli oggetti in ogni riferimento gerarchia di un sottoinsieme degli oggetti nell'altra gerarchia. Ad esempio /users/{id}/bought
è un elenco dei prodotti acquistati da un utente, che è un sottoinsieme di /products
. Inoltre, /products/{id}/seller
fa riferimento all'utente che ha venduto un prodotto specifico.
Poiché questi URI fanno riferimento ad altri oggetti o sottoinsiemi di altri oggetti, l'API deve supportare cose come questa: /users/{id}/bought/id/description
e /products/{id}/buyer/location
? Perché se quei tipi di URI sono supportati, cosa si può fermare qualcosa come questo /users/{id}/bought/{id}/buyer/bought/{id}/seller/name
o qualcosa di altrettanto contorto? Inoltre, in questo caso, come gestireste il routing poiché il router nel server dovrebbe interpretare gli URI di lunghezza arbitraria?
Quindi, quello che stai dicendo è che ogni risorsa nel sistema ha esattamente ** ** un URI? Perché questo rende tutto molto più semplice. Nell'esempio sopra, cosa consiglieresti se volessi esporre il venditore di alcuni prodotti tramite l'API (i prodotti hanno solo un venditore)? Dovrei semplicemente fare in modo che le persone facciano * GET/products/{id} * che restituirebbe qualche oggetto JSON con il venditore al suo interno? – martega
JSON per '/ products/{id}' può contenere oggetti utente nidificati per comodità o url per quell'utente, è una tua scelta e non cambia il fatto che entrambi esistono separatamente. – Anri
btw, aiuta a guardare le API di altri servizi. Ad esempio: https://developer.foursquare.com/docs/venues/venues – Anri