Devo restituire una risposta 204 o 404 quando non si trova una risorsa?

6

Sto sviluppando un semplice servizio RESTful per i tornei e gli orari. Quando un torneo viene creato tramite una richiesta POST contenente un corpo JSON, il torneo viene inserito in un BiMap , dichiarato come segue in un'implementazione DAO:

private BiMap<String, Tournament> tournaments = Maps.synchronizedBiMap(HashBiMap.create());

Quando viene creato un torneo, viene restituito l'ID stringa associato in modo che l'utente possa avere riferimento futuro di quel torneo. Lui / lei può ottenere informazioni dal nuovo torneo che effettua la seguente richiesta:

GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39

Ma cosa succede se non viene trovato nessun torneo con tale ID? Finora, sto restituendo una risposta 204. Bene, Jersey lo sta facendo per me quando restituisce null da uno dei suoi metodi. Questo è il metodo che corrisponde alla rotta sopra:

@Path("/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Tournament getTournament(@PathParam("id") String id) {
    Optional<Tournament> optTournament = tournamentDao.getTournament(id);
    if (optTournament.isPresent())
        return optTournament.get();
    return null;
}

La mia domanda è: è OK restituire una risposta 204: No Content , oppure dovrebbe essere una risposta 404 , poiché la risorsa non è stata trovata?

Se dovessi cambiarlo in una 404, ovvia domanda: dovrei cambiare la firma del metodo giusto? Poiché ora un torneo (di tipo Tournament ) potrebbe non essere restituito, il metodo dovrebbe apparire diverso. Dovrei usare invece il tipo Response come tipo di ritorno?

    
posta dabadaba 22.06.2016 - 15:02
fonte

3 risposte

18

HTTP 204 significa che è stato trovato qualcosa , ma è vuoto. Ad esempio, immagina di servire i file di registro tramite HTTP, con richieste come < a href="http://example.com/logs/%5Bdate-goes-here%5D"> link . Il 18 maggio 2015:

  • link restituirebbe HTTP 404 , il che significa che non ci sono log, perché, bene , è difficile accedere al futuro.

  • link , tuttavia, restituire HTTP 200 con le voci del registro nel contenuto di la risposta, o HTTP 204 se il file di registro è stato creato, ma non ci sono ancora registri registrati ancora per questa data.

Se fornisci null al framework come risposta a una richiesta, si presuppone che hai trovato una voce, e questa voce è vuota, quindi HTTP 204 . Invece, dovresti throw new NotFoundException(); per indicare al framework che la voce non esiste, in modo da generare un HTTP 404 .

If I should change it to a 404, obvious question: I should change the method signature right?

No, non lo fai. Questa è la cosa bella di throw new NotFoundException(); . Funzionerà indipendentemente dal tipo di ritorno effettivo del tuo metodo.

    
risposta data 22.06.2016 - 15:14
fonte
3

Dovresti restituire un 404. Puoi farlo lanciando una NotFoundException ( link ).

Per favore guarda anche questa domanda SO se hai bisogno di controllare il tipo di contenuto restituito link

    
risposta data 22.06.2016 - 15:15
fonte
1

La tua richiesta è GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39 .

Se http://localhost:8080/eventscheduler/ non esiste come endpoint, dovresti restituire un 404. Stai tentando di accedere a una risorsa ( /eventscheduler/ ) che non esiste. Ciò indicherebbe a un client che un server esiste su localhost:8080 , ma non c'è nulla sull'endpoint eventscheduler .

Se http://localhost:8080/eventscheduler/ esiste come endpoint ma le risorse richieste non sono disponibili, è appropriato un errore 5xx. Un buon esempio di ciò sarebbe se un database fosse offline, dove si potrebbe restituire un 503. Naturalmente, si potrebbe voler semplicemente restituire un errore generico di 500 invece di un'istanza specifica.

Se http://localhost:8080/eventscheduler/ esiste ma la cosa rappresentata da c15268ce-474a-49bd-a623-b0b865386f39 non esiste, restituirei 200 con un corpo che indica i dettagli. L'endpoint esiste, la richiesta è stata completamente valida e potrebbe essere elaborata, ma non c'era corrispondenza.

Se la richiesta del tuo cliente all'endpoint non era valida, dovresti esaminare gli altri errori 4xx. È possibile indicare che il cliente non è autorizzato ad accedere all'endpoint o agli articoli richiesti con un 401 o 403 o può utilizzare un 400 per indicare che la richiesta non è valida. Con uno di questi, è possibile fornire ulteriori informazioni nel corpo della risposta.

    
risposta data 23.03.2018 - 18:17
fonte

Leggi altre domande sui tag