Immagina un'API per identificare se una persona ha selezionato il suo animale spirituale. Possono avere solo zero o un animale spirito.
Attualmente:
/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 animale spirituale infelice poiché rappresentiamo una preoccupazione di dominio valida - 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 alcuna selezione in modo da poterlo sollecitare.
Qual è una risposta migliore qui:
HTTP 200 e {selectedAnimal:null}
o ancora più esplicito
HTTP 200 e {selectedAnimal:null, spiritAnimalSelected: false}
O è meglio restituire un 404? Dal momento che molto simile this image has not yet been uploaded
alla visualizzazione di un'immagine online sarebbe un 404. this person has not selected a spirit animal
potrebbe essere un 404
Questa domanda è stata proposta come duplicata, ma quella domanda affronta un URL altrimenti valido richiesto quando l'applicazione è stata configurata per non consentire la modifica rappresentata dall'URL.
Mentre qui sto osservando come si rappresenta una risorsa in cui l'assenza della risorsa è significativa. Vale a dire che è valido per il client richiedere l'URL e la risposta è che hai richiesto correttamente la risorsa che rappresenta un'assenza di una cosa.
Quindi questa non è una "logica di business", ma piuttosto una circostanza in cui l'assenza di qualcosa ha un significato (potrebbe essere come molti dei miei colleghi sostengono che 404 sia ancora corretto) ma non sono sicuro di come mapparlo al spec.
Molto difficile scegliere una risposta. Ho cambiato idea più volte durante la conversazione qui e quella in corso al lavoro.
La cosa che lo risolve per me qui è che la specifica dice che un 4xx è quando il client ha sbagliato . In questo caso al cliente è stato detto di aspettarsi una risposta dall'URL selezionatoSpiritAnimal, quindi non ha commesso errori.
Il consenso tra i miei colleghi è che questo è un sintomo di una cattiva progettazione delle API
Probabilmente sarebbe meglio che semplicemente richiedessimo / person / {id} e che restituisca un insieme di relazioni di link per la persona ... quindi se non ti viene dato il link / selectedSpiritAnimal (quando una persona non ha selezione) ma tu chiamalo 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 cliente non richieda un sottoinsieme dei dati