2009-06-22 15 views
7

sto costruendo un servizio web che viene utilizzato, in questo caso particolare, per chiedere informazioni su un utente.Quale codice Http devo restituire per "Cosa non trovata"?

Diciamo che, per amor di discussione, che il colpo di ricerca web è:

GET /patrons/619 HTTP/1.1 

Se viene trovato il patrono, torno codice 200:

HTTP/1.1 200 OK 

Se si omette, o dare un numero di conto che non è un numero, torno 400. Ad esempio, le seguenti richieste cattivi:

GET /patrons HTTP/1.1 
GET /patrons/ HTTP/1.1 
GET /patrons/G619 HTTP/1.1 
GET /patrons/kirsten%20guyer HTTP/1.1 

tutto il ritorno errore 400 (Richiesta non valida), ad es .:

HTTP/1.1 400 Invalid patron number 

voglio avere un codice di stato per patron non trovato, restituito come il codice di stato HTTP. Per esempio:

GET /patrons/1322 HTTP/1.1 

HTTP/1.1 404 Not Found 

ho pensato di usare 404 (Not Found), che è una valida risposta (la risorsa richiesta era, realmente e veramente, non trovato.) Ma ho paura persone che eseguono il debugging potrebbero pensare che ciò significa che hanno digitato /patrons/ errato.

Qualcuno può pensare a un altro codice di stato http che potrei usare?


Aggiornamento: sto eyeballing

204 No Content 
The server successfully processed the request, but is not returning any content. 

Cosa dici?


Non dimenticare, che non tutti i server HTTP servono contenuti HTML. Se viene richiesto un server Web IIS per una risorsa denominata:

GET /MyStartPage.html HTTP/1.1 

Quindi il server HTTP deve decidere con cosa rispondere. Sulla maggior parte dei server Web, una risorsa denominata /MyStartPage.html corrisponde a un file che si trova sul disco rigido.

Mentre StackOverflow fa:

GET /posts/1027301 HTTP/1.1 

Il che, se tale risorsa non esiste, il web-server dovrebbe (a ragione) di ritorno 404.

+0

Non credo che un errore a 200 livelli sia appropriato, considerate le spiegazioni su W3 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html – defines

risposta

17

404 Non trovato è la cosa corretta da restituire, se si tratta di un servizio, non viene realmente utilizzato dagli esseri umani ma dalle macchine e, pertanto, gli errori di battitura non dovrebbero essere la vostra prima preoccupazione.

Inoltre, c'è ben poco che sarà in grado di fare per contrastare il comportamento umano (pensando una cosa quando è davvero un'altra). Se stai restituendo un piccolo messaggio di errore come parte del codice di errore, tutto dovrebbe funzionare. Potresti anche suggerire loro una possibile soluzione.

Restituire un valore di 500 quando l'applicazione sta facendo esattamente quello che è stato progettato per fare sembra anche un po 'strano. 404 descrive esattamente la situazione: risorsa non trovata.

+0

darò al post ancora un po 'di ore per avere la possibilità agli altri di parlare, ma mi piace la tua risposta. E le tue elaborazioni su altri errori –

5

IMHO, la risposta HTTP non è il luogo corretto per gestire questo, in quanto l'errore non è a livello HTTP. È a livello di applicazione. Una possibile soluzione consiste nell'utilizzare Null Object Pattern per restituire un 'Patron' nullo che sia conforme all'interfaccia utente, ma indica che tale persona non esiste.


UPDATE: Sono stato convinto che questa risposta è sbagliata. Tuttavia, voglio lasciarlo, in quanto è una risposta potenzialmente valida (a seconda dei dettagli non presentati nella domanda), e penso che i commenti siano istruttivi.

+0

Concordato con questo. I codici di stato HTTP non sono esattamente il luogo in cui descrivere gli eventi che gli umani interpretano. –

+2

Cosa ti fa pensare che gli umani interpreteranno questo? –

+0

+1 Esatto al centro. – blntechie

2

In genere se il servizio rileva un errore che non è in grado di gestire, ma la richiesta è ben formata, quindi penso che si desideri restituire un codice di stato 500.

Inoltre, un altro motivo per cui dico che 500 sarebbe appropriato è che dalla mia esperienza in servizi Web .NET, ogni volta che lancio un'eccezione attraverso il filo (come un'eccezione RecordNotFound), il server Web e il client hanno sempre interpretato la risposta è un codice di stato 500.

In entrambi i casi, sarebbe una buona idea rivedere questo list dei codici di stato http e va bene quello che soddisfa le tue esigenze al meglio.

+0

È corretto che il tuo server web consideri un'eccezione generata come un errore 500, ma sarebbe più appropriato che il codice del tuo servizio web che sta generando l'eccezione indirizzasse il server a restituire un 404 risposta. – defines

+0

@Dustin Non se si intende che il proprio cliente consumi l'eccezione. Se si indirizza il server per restituire una risposta 404, in che modo il client consuma l'eccezione? Non sono un esperto di risposte http, quindi mi chiedo legittimamente perché non sono sicuro. Quello che so è che se intendo che il mio cliente consumi le mie eccezioni, per impostazione predefinita (e non sono a conoscenza che questo sia configurabile) il server risponderà con un codice di 500. Questa è la mia esperienza con i servizi Web .NET. – Joseph

+0

Ho intenzione di indirizzarti alla risposta pubblicata da Andreas, che lo spiega abbastanza bene. Questo non ha nulla a che fare con .NET, si tratta di un problema di richiesta/risposta (HTTP) client-server. In questo caso non introdurrei un'eccezione nella mia applicazione, altrimenti invierei l'intestazione di risposta 404 o invierò 200 con un messaggio di contenuto che descrive l'errore. Lanciare un'eccezione dovrebbe indicare che c'è qualcosa di sbagliato nel codice dell'applicazione, e quindi in modo appropriato 500 errori del server sarebbe la risposta. – defines

6

Errore 404 è in realtà una risposta più accettabile per questo caso, poiché la risorsa non è stata trovata realmente. È sempre possibile avere un documento di errore personalizzato che spiega che è l'ID utente che non è stato trovato.

Un errore 400 implica che il client ha inviato la sintassi non valida, che non è il caso nel tuo esempio. Quindi, non dovresti usare questo codice di errore. Potrebbe sembrare che "Richiesta errata" sia accurata, ma in realtà ciò significa che c'è un errore nella sintassi dell'intestazione della richiesta.

Anche questo non è un errore 500 perché non si è verificato alcun errore. Non c'è alcun problema con il server web che soddisfa la richiesta, il fatto è che la richiesta sta cercando una risorsa che non è presente.

404 è l'unica risposta appropriata, a meno che non si desideri considerarla una richiesta pienamente valida, lo stato di ritorno 200 e una pagina che spieghi che l'utente richiesto non esiste.

Dal mio commento originale sulla questione:

Non credo che un errore 200 di livello sarebbe appropriato o, prendere in considerazione le spiegazioni a W3 w3.org/Protocols/rfc2616/rfc2616-sec10.html

+2

+1 per il motivo per cui 200 -meglio- va bene, invece di dire "Sì, invia 200 con codice di errore". – maxwellb

7

penso dovresti usare 404. Gli sviluppatori dell'API capiranno cosa significa 404 e quindi seguiranno il proprio normale processo di debug per risolvere il problema. Attenersi al protocollo.

0

Gli errori a livello di servizio Web non devono solo restituire una semplice riga di stato HTTP, ma devono invece restituire il contenuto in un formato valido e documentato che può essere analizzato dal client che accede al servizio.Il documento restituito deve contenere un codice di errore che fa parte di un set documentato di codici specifici per il tuo servizio web, oltre a una breve descrizione del problema e facoltativamente una descrizione più dettagliata del problema.

1

Dipende dal tipo di servizio Web che si sta costruendo.

I servizi Web SOAP e XML restituiscono in genere 200 OK se non è possibile trovare un oggetto richiesto (utente) e codificare il tipo di errore/messaggio/descrizione nel documento di risposta. Separano un livello di trasporto (HTTP) dai messaggi scambiati (XML). Viene restituito un errore 404 (che si trova sul livello di trasporto), se si richiede un endpoint dell'API non esistente (URL errato).

Con un servizio web REST, tuttavia, si utilizzano i metodi e gli stati HTTP direttamente per lo scambio di messaggi. REST utilizza diversi metodi HTTP (GET/POST/PUT/DELETE) per specificare quale azione è richiesta e il server restituisce lo stato come stato HTTP. Quindi, nel caso di un webservice REST, 404 sarebbe lo stato HTTP corretto se non è possibile trovare un utente.

500 è inappropriato in ogni caso, perché 5xx significa che c'è stato qualcosa di sbagliato sul lato server (che non è il caso) mentre gli errori 4xx significano che c'è qualcosa di sbagliato sul lato client.

0

Se si desidera controllare le risposte del servizio Web tramite i codici di risposta HTTP, è possibile utilizzare un 404 per indicare questa condizione.

Tuttavia, penso che sia più naturale avere la risposta del servizio Web definita interamente nel corpo della risposta HTTP e restituire solo 200 per una comunicazione corretta ("Ho capito la tua richiesta e ti ho inviato una risposta appropriata"). In questo caso, restituiresti 200 come normale con il payload della tua richiesta (XML o JSON o qualsiasi altra cosa) indicando che non è stata trovata alcuna entità corrispondente

Prenderei in considerazione codici di errore non-200 simili alle eccezioni in convenzionale i linguaggi di programmazione e il corpo della risposta HTTP sono più simili al codice di ritorno. Immagina se tu stia implementando questo in modo convenzionale - potresti lanciare un'eccezione se non è stata trovata alcuna entità, o restituire null? Personalmente, data la natura fragile delle connessioni di rete, vorrei riservare tutti i codici di errore a livello HTTP per problemi di comunicazione, e preferirei sempre restituire 200 OK dal servizio stesso, insieme a un carico utile che specifica il risultato o qualsiasi servizio errore di livello.

1

Potrebbe essere 4 anni ma è ancora abbastanza rilevante. Per le API che devono essere utilizzate da borSer e app native, trovo che sia molto più semplice utilizzare i codici HTTP per l'indicazione dello stato. E se necessario, usa un paio di codici extra da quelli non assegnati per condizioni che non si adattano bene ai codici HTTP esistenti.

Problemi correlati