Direi, nessuno dei due.
Perché non 404 (non trovato)?
Il codice di stato 404 dovrebbe essere riservato per le situazioni in cui una risorsa non viene trovata. In questo caso, la tua risorsa è una raccolta di utenti . Questa raccolta esiste ma è attualmente vuota. Personalmente, sarei molto confuso come autore di un client per la tua applicazione se ne avessi uno 200
un giorno e uno 404
il giorno successivo solo perché qualcuno ha rimosso un paio di utenti. Cosa dovrei fare? Il mio URL è sbagliato? Qualcuno ha cambiato l'API e ha trascurato di lasciare un reindirizzamento.
Perché non 204 (nessun contenuto)?
Ecco un estratto dalla descrizione del codice di stato 204 di w3c
Il server ha soddisfatto la richiesta ma non ha bisogno di restituire un corpo dell'entità e potrebbe voler restituire le metainformazioni aggiornate.
Sebbene ciò possa sembrare ragionevole in questo caso, penso che confonderebbe anche i clienti. A 204
dovrebbe indicare che alcune operazioni sono state eseguite correttamente e che non è necessario restituire dati. Questo è perfetto come risposta a una DELETE
richiesta o forse per attivare uno script che non ha bisogno di restituire dati. In questo caso api/users
, di solito ti aspetti di ricevere una rappresentazione della tua raccolta di utenti. Inviare un corpo di risposta una volta e non inviarlo l'altra volta è incoerente e potenzialmente fuorviante.
Perché dovrei usare un 200 (OK)
Per i motivi sopra menzionati (coerenza), restituirei una rappresentazione di una raccolta vuota. Supponiamo che tu stia utilizzando XML. Un normale corpo di risposta per una raccolta di utenti non vuota potrebbe essere simile a questo:
<users>
<user>
<id>1</id>
<name>Tom</name>
</user>
<user>
<id>2</id>
<name>IMB</name>
</user>
</users>
e se l'elenco è vuoto, potresti semplicemente rispondere con qualcosa del genere (mentre usi ancora a 200
):
<users/>
In ogni caso, un client riceve un corpo di risposta che segue un formato certo e ben noto. Non c'è confusione inutile e controllo del codice di stato. Inoltre, non viene violata alcuna definizione del codice di stato. Tutti sono felici.
Puoi fare lo stesso con JSON o HTML o qualsiasi formato tu stia utilizzando.