Ho una domanda su come dovrei implementare una nuova azione per una risorsa sul mio livello API.
Ho un Timesheet
che viene utilizzato dalle persone per farci sapere quante ore hanno lavorato a un lavoro. Questa scheda attività ha uno stato:
- Apri (ancora in corso)
- Inviato (sarà esaminato da un dipartimento)
- Rifiutato (Rifiutato dal dipartimento, l'utente deve correggere la scheda attività e inviare di nuovo)
- Approvato (approvato dal dipartimento)
- ... alcuni altri che renderebbero l'intera cosa troppo complicata
La nostra API ATTUALMENTE ha la possibilità di cambiare lo stato, che viene utilizzato dal nostro front-end premendo un pulsante (non è importante, è solo per disegnare un'immagine).
L'endpoint corrente è POST (website)/api/timesheets/{id}/submit
dove l'ID è l'id della scheda attività. L'API è abbastanza intelligente da controllare se la scheda attività può essere inviata e in quale stato deve essere modificata (ci sono altri stati che non sono menzionati qui).
Al termine, la nostra API corrente restituisce l'intero modello della scheda attività con lo stato aggiornato e il SubmittedDate
.
Ho lavorato alla creazione di una v2 dell'API e ora sto pensando se dovrei ancora usare POST
e cosa dovrei restituire dalla chiamata API.
Motivi per cui dubito di POST
:
- Non non crea una nuova risorsa
-
PATCH
sarebbe una misura migliore dal momento che stiamo aggiornando una risorsa esistente, ma non stiamo inviando un corpo di richiesta all'API.
Motivi per cui dubito del valore restituito:
- Restituzione di NOTHING (
200 OK
o204 No content
)-
POST
può (per linee guida) restituire200 OK
o204 No content
se la risorsa non può essere trovata con un URI. La mia risorsa può quindi questo non ha senso?- D'altra parte, non stiamo seguendo realmente le linee guida se ho un
submit
di endpoint poiché lo stato cambia. Ma non voglio nemmeno che il chiamante decida quale dovrebbe essere il nuovo stato poiché l'API lo decide da solo e ha anche alcune azioni di follow-up.
- D'altra parte, non stiamo seguendo realmente le linee guida se ho un
- Il mio front-end ora dovrebbe fare una chiamata a
GET api/timesheets/{id}
per ottenere nuovi dati, che è forse un po 'uno spreco?
-
- Restituzione del nuovo stato e data di rifiuto
- Ciò significherebbe che il valore di ritorno della mia API è stato creato appositamente per il nostro front-end e che altri client che utilizzano la mia API non avrebbero bisogno di questo specifico valore di ritorno.
- Restituzione dell'intero modello
- Spreco di spazio dal momento che è necessario utilizzare un paio di proprietà.
- In StackOverflow ho trovato una discussione in cui menzionano che l'utilizzo di POST e un valore di ritorno potrebbero portare a problemi di memorizzazione nella cache. Usiamo una nuova versione di Angular e qualcuno del mio team ha detto che anche se qualcuno lascia la pagina e la inserisce di nuovo, il
GET
verrà sempre eseguito. Non posso dire se è vero al 100%.
Qualcuno può aiutarmi a decidere quale azione HTTP dovrebbe essere utilizzata (con alcuni motivi per cui) e cosa dovrebbe essere restituito:)?
Grazie mille!