Sto sviluppando un Api REST usando Node.js & Express.js . Recentemente ho iniziato a cercare le migliori pratiche per il design REST Api, ma è un po 'confuso quindi ti prego di sopportare me.
Ad esempio:
Diciamo che ho le seguenti raccolte di API:
- Utenti
- Attività (ogni attività deve appartenere a un utente)
E avere queste risorse:
- OTTIENI
/api/users
restituisce tutti gli utenti - OTTIENI
/api/users/:id
restituisce un utente specifico - POST
/api/users
creerà un singolo utente - POST
/api/users/:id
aggiornerà un utente specifico - POST
/api/tasks
creerà una nuova attività ma la assegnerà all'utente connesso. - POST
/api/tasks/:id
aggiornerà una specifica attività - OTTIENI
/api/tasks
otterrà tutte le attività - OTTIENI
/api/users/:id/tasks
otterrà tutte le attività per un utente specifico - OTTIENI
/api/users/:id/tasks/:id
otterrà un'attività specifica per un utente specifico
Ora ogni "risorsa" sopra è reindirizzato verso un "controllore " che esegue effettivamente azioni.
Ad esempio:
POST ('/api/users', myController)
let myController = (req,res) => {
Create new User
Save to Database
Call Private Send an Email to Admin function etc
}
Domande:
Diciamo che devo eseguire alcune query su una risorsa come filter
dovrei:
OPZIONE 1:
Crea una nuova risorsa come /api/users/:id/tasks/filter
e all'interno del mio controller ed esegui le azioni di filtro sul database all'interno del controller
OPZIONE 2:
Utilizza stringhe di query come /api/users/:id/tasks?filter=title::someValue&priority::someOtherValue
. In base alle mie conoscenze, NON crea una nuova risorsa, ma chiameremo semplicemente la risorsa /api/users/:id/tasks
con le stringhe di query sopra.
Se seguo OPZIONE 2 questo significa che avrò un solo controller che gestisce le azioni /api/users/:id/tasks
in modo da gestire qualsiasi query per questa risorsa dovrei fare quanto segue:
GET ('/api/users/:id/tasks', myController)
let myController = (req,res) => {
if(req.filter)
{handle Query here and get data from database and return to user}
else if(some other query)
{handle query here}
else if(some other query)
{handle query here}
else {
if there are NO queries then get get all Tasks for a specific User.
}
}
L'implementazione / concetto di cui sopra è corretta? A me sembra disordinato e confuso. Quindi cosa sto facendo di sbagliato qui? Qual è il modo corretto di gestire le query? Un controller singolo per una risorsa dovrebbe gestire tutto per quella particolare risorsa?
Ho problemi a pensare in "REST" ci sono così tante informazioni che non sono sicuro di cosa sia giusto e che cosa non va. Quindi i miei principi di base sono un po 'deboli quindi qualsiasi guida a tale proposito sarebbe molto utile (eventuali articoli o risorse online).