Risposta REST corretta per tabella vuota?


106

Supponiamo che tu voglia ottenere l'elenco degli utenti chiamando GETa api/users, ma attualmente la tabella è stata troncata, quindi non ci sono utenti. Qual è la risposta corretta per questo scenario: 404o 204?


19
Risponderei con 200 e una raccolta vuota (non un corpo di risposta vuoto ma piuttosto una raccolta senza elementi all'interno, apparirà diversa a seconda del formato restituito)
toniedzwiedz

4
404 in questo contesto sarebbe probabilmente più adatto per "tabella non trovata". Direi di restituire un elenco vuoto.
mata


2
@EJoshuaS Non lo è. Entrambe le domande sono mie e molto vecchie. Sono simili ma non duplicati.
IMB

1
@EJoshuaS Ovviamente non sono duplicati. Questa domanda riguarda il /api/usersmentre si tratta /api/users/1.
Franklin Yu

Risposte:


230

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 200un giorno e uno 404il 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 204dovrebbe indicare che alcune operazioni sono state eseguite correttamente e che non è necessario restituire dati. Questo è perfetto come risposta a una DELETErichiesta 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.


4
Assolutamente d'accordo. E per il riposo, vorrei semplicemente restituire un codice di stato di 200 con un array vuoto: [].
Chad Johnson

Ha senso. Non c'è bisogno di renderlo più difficile. 404 sarebbe fonte di confusione.
Witold Kaczurba

Supponiamo che le API che descrivono le monete in tasca, con punti finali: GET /singleCoin- restituisca una singola moneta casuale dalla tua tasca, GET /severalCoins- restituisca alcune monete dalla tua tasca che puoi prendere in una volta. Diciamo che al momento non hai monete in tasca. Quando chiedi a GET /singleCoinriceverai 404 Not Found, ma quando chiedi a GET /severalCoinsriceverai 200 OKcon un elenco vuoto []. Un fatto: non hai monete, descritto con risposte diverse, perché? Direi che è sempre meglio procurarsi 404 Not Found, perché non ci sono monete trovate in tasca.
sempasha

1
@sempasha Dipende da cosa intendi GET /severalCoins. Se imposti che GET /severalCoins deve restituire alcune monete, non dovrebbe essere 200 perché non va bene; il server non è riuscito a fornire ciò che il client desidera. Per /singleCoinquesto è ovvio perché il cliente desidera esattamente una moneta, né più né meno. Questo è lo stesso per /coins/7. Al contrario /coinsdell'endpoint, in genere i clienti non si aspettano nessuna moneta, una moneta o più monete. Sono tutte risposte valide. Se non ci sono monete, questo è quello che vogliono. È come un emply List<Coin>in Java, invece di null.
Franklin Yu

15

Risponderei a uno dei due codici a seconda della situazione di runtime:

404 non trovato)

Questa risposta è abbastanza corretta se non hai un tavolo. Non solo una tabella vuota, ma NESSUNA TABELLA UTENTE. Conferma l'idea esatta - nessuna risorsa. Ulteriori opzioni sono fornire maggiori dettagli PERCHÉ la tua tabella è assente, ci sono un paio di codici più dettagliati ma 404 è abbastanza buono per fare riferimento a situazioni in cui non hai davvero una tabella.

200 (OK)

Tutti i casi in cui si dispone di una tabella ma è vuota o il processore delle richieste ha filtrato tutti i risultati. Ciò significa che 'la tua richiesta è corretta, è tutto OK ma non hai trovato alcun dato solo perché non abbiamo dati o non abbiamo dati che corrispondono alla tua richiesta. Questo dovrebbe essere diverso dalla risposta alla negazione della sicurezza. Voto anche per restituire 200 in situazioni in cui si dispone di alcuni dati e in generale è consentito accedere alla tabella ma non si ha accesso a tutti i dati che corrispondono alla richiesta (i dati sono stati filtrati a causa della sicurezza a livello di oggetto ma in generale è consentito richiesta).


10

Se ti aspetti un elenco di oggetti utente, la soluzione migliore è restituire un elenco vuoto ([]) con 200 OK anziché utilizzare una risposta 404 o 204.


2

restituisce sicuramente 200.

404 significa risorsa non trovata. Ma la risorsa esiste. Inoltre, se la risposta ha lo stato 404. Come puoi sapere che l'elenco degli utenti è vuoto o pieno?


  • "/ utenti" se è vuoto dovrebbe restituire "200".
  • "/ users / 1" se l'id non viene trovato. dovrebbe restituire 404.

2

Deve 200 OK con elenco vuoto.

Perché: tabella vuota significa che la tabella esiste ma non ha alcun record.

404 Non trovato significa che il punto finale richiesto non esiste.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.