2015-05-13 12 views
5

So che questa è una domanda abbastanza comune, ma non ho trovato una risposta che mi soddisfi.HTTP 200 o 404 per la lista vuota?

Ho utilizzato il framework di restituzione django per un po 'di tempo, ma questo è per lo più irrilevante rispetto all'esempio fornito. Il suo comportamento predefinito è quello di restituire un HTTP 200 con una risorsa lista vuota quando si accede a una rotta con una lista vuota di elementi. Es .: se avessimo una rotta come /articles/ per accedere a un elenco di articoli, ma non conteneva elementi che otterremmo una risposta simile al seguente JSON:

{"count":0, "next":null, "previous":null, "items": []} 

Che è perfettamente bene. Abbiamo trovato la risorsa che cercavamo in/articles /, semplicemente non ci sono elementi in essa contenuti.

Se si accede al percorso /articles/?page=1, otteniamo esattamente la stessa risposta.

Fin qui tutto bene. Ora proviamo ad accedere a /articles/?page=2 e il codice di risposta cambia. Ora ottieni un 404 come se non fosse possibile trovare la risorsa con un messaggio di errore che diceva che la pagina non contiene risultati. Che è lo stesso caso di? Page = 1 ...

Sono stato perfettamente d'accordo con questo comportamento, ma oggi ho iniziato a mettere in discussione questo progetto. In che modo la custodia ?page=1 è diversa da ?page=2? Inoltre, come si può sapere se la richiesta è "valida" quando si invia una richiesta HEAD? Valido nel senso di contenere qualsiasi risultato.

Questo potrebbe essere utile in casi come il filtraggio di un elenco per verificare la disponibilità di un determinato campo (ad esempio, emissione di una richiesta HEAD a /users/?username=ted).

  • Una risposta di 200 significherebbe chiaramente che la richiesta è stata capita e gli articoli sono stati trovati.
  • A 404 significherebbe la richiesta è stata registrata, ma sono articoli sono stati trovati in quella posizione/URI (AFAIK query parametri sono anche parte della URI)
  • Nel caso la richiesta non può essere compreso un 400 sarebbe ritornato per gli errori sintattici e 422 per gli errori semantici.

È un buon design? Perché la maggior parte delle persone sembra non essere d'accordo e quali sono gli svantaggi?

+4

IMHO 200 è migliore perché 404 non consente di distinguere tra * nessun API distribuito * e * elenco vuoto *. –

+0

Non è concettualmente lo stesso? Non ci sono risorse in quella posizione. Un cliente non dovrebbe (in teoria) preoccuparsi degli endpoint in una corretta implementazione del riposo, quindi la differenza non dovrebbe avere importanza (di nuovo, in teoria, sotto una corretta pausa di riposo). –

+1

Il modo in cui lo vedo: '/ articles /' è la lista di tutti gli articoli; anche se è vuoto, esiste ancora. E sulla maggior parte dei siti, anche una lista vuota ha una pagina uno, per dirti che non ci sono risultati. –

risposta

7

Vorrei andare per 200 perché la risorsa è articles. Durante la ricerca di ted in users lo stesso vale, users è la risorsa e finché è lì, un 200 va bene dal mio punto di vista. Se fosse GETusers/ted uno 404 sarebbe buono come un 410 (GONE) se un utente di nome ted era lì in passato (potrebbe applicarsi meglio agli articoli che agli utenti).

+0

Quale sarebbe il caso di/articles /? Page = 2 quando la pagina 2 non esiste? Seguendo la tua stessa logica,/articles/esiste quindi un 200 dovrebbe essere restituito anche se non ci sono elementi. Ho ragione? Non sarei d'accordo con questo disegno, ma come ho detto sul post originale, capisco perché alcune persone sono d'accordo con esso. Mi è capitato di seguire una linea di pensiero diversa qui. –

+2

'/ articles /? Page = 2' genererebbe 200 risposte contenenti una lista vuota, perché ci sono articoli, ma nessuno nella seconda pagina. – sschrass

+2

Lo uso come una query db, dove il set di risultati è vuoto, ma la query è sintatticamente a posto. – sschrass

0

200 indica semplicemente che la richiesta è riuscita.Le informazioni restituite con la risposta dipendono dal metodo utilizzato nella richiesta, ad esempio: GET un'entità corrispondente alla risorsa richiesta viene inviata nella risposta;

HEAD i campi dell'entità dell'intestazione corrispondenti alla risorsa richiesta vengono inviati nella risposta senza alcun corpo del messaggio;

POST un'entità che descrive o contiene il risultato dell'azione;

TRACCIA un'entità che contiene il messaggio di richiesta ricevuto dal server finale. 404 - Il server non ha trovato nulla che corrisponda all'URI della richiesta - In questo caso penso che significa che non abbiamo trovato la pagina in cui gli articoli sarebbero stati elencati. Quindi 200 lo è. - ma forse capire cosa viene restituito e formattare un messaggio che 0 articolo è stato restituito.

1
  1. Perché stiamo bene con una pagina vuota1, non va bene con una pagina vuota2.

Questo è guidato dalla considerazione dell'interfaccia utente (pagina1 deve esistere!), Tuttavia, decide il codice di risposta.

Problemi correlati