Immagina un'API per identificare se una persona ha selezionato il proprio animale spirituale. Possono avere solo zero o animali spirituali.
In questo momento:
/person/{id}/selectedSpiritAnimal
quando hanno selezionato un animale restituisce http 200 e {selectedAnimal:mole}
ma quando non hanno alcuna selezione restituisce http 404.
Questo rende il mio spirito animale infelice poiché stiamo rappresentando un problema di dominio valido - non avendo ancora selezionato un animale spirituale - come un errore HTTP.
Inoltre, come azienda - erm Sprit-Animal-Hampers-R-us - vogliamo sapere quando qualcuno non ha selezione in modo da poterli richiedere.
Qual è la risposta migliore qui:
HTTP 200 e {selectedAnimal:null}
o anche più esplicito
HTTP 200 e {selectedAnimal:null, spiritAnimalSelected: false}
O è meglio restituire un 404? Poiché molto simile a this image has not yet been uploaded
quando si visualizza un'immagine online sarebbe un 404.% dithis person has not selected a spirit animal
potrebbe essere un 404
Questa domanda è stata proposta come un duplicato, ma quella domanda risolve un URL valido che viene richiesto quando l'applicazione è stata configurata per non consentire la modifica che l'URL rappresenta.
Mentre qui sto osservando come si rappresenta una risorsa in cui l'assenza della risorsa è significativa. Cioè è valido per il client per richiedere l'URL e la risposta è che hai richiesto con successo la risorsa che rappresenta l'assenza di una cosa.
Quindi questa non è la "logica del business", ma piuttosto una circostanza in cui l'assenza di una cosa ha un significato (potrebbe essere che molti dei miei colleghi sostengono che 404 è ancora corretto) ma non sono sicuro di come mappare quello alla specifica.
Molto difficile scegliere una risposta. Ho cambiato idea più volte durante la conversazione qui e quella in corso al lavoro.
La cosa che lo sistema per me qui è che la specifica dice che un 4xx è quando il cliente ha sbagliato . In questo caso, al client è stato detto di aspettarsi una risposta dall'URL selectedSpiritAnimal, quindi non ha commesso errori.
Il consenso tra i miei colleghi è che questo è un sintomo di un cattivo design API
Probabilmente sarebbe meglio che chiedessimo semplicemente / person / {id} e che restituisca un insieme di relazioni di collegamento per la persona ... quindi se non ti viene dato il link / selectedSpiritAnimal (quando una persona non ha selezione ) ma tu lo chiami comunque allora un 404 ha un senso. Oppure implementare risposte parziali e lasciare che / person / {id} restituisca un documento più completo a meno che il client non richieda un sottoinsieme di dati