it-swarm.com.de

Sollte ich eine 204- oder 404-Antwort zurückgeben, wenn eine Ressource nicht gefunden wird?

Ich entwickle einen einfachen RESTful-Service für Turniere und Zeitpläne. Wenn ein Turnier über eine POST - Anforderung mit einem JSON-Body erstellt wird, wird das Turnier in ein BiMap eingefügt, das in einer DAO-Implementierung wie folgt deklariert ist:

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

Wenn ein Turnier erstellt wird, wird die zugehörige Zeichenfolgen-ID zurückgegeben, damit der Benutzer eine zukünftige Referenz für dieses Turnier haben kann. Er/sie kann Informationen vom neuen Turnier zurückerhalten und die folgende Anfrage ausführen:

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

Aber was ist, wenn kein Turnier mit einer solchen ID gefunden wird? Bisher gebe ich eine Antwort zurück. Nun, Jersey tut es für mich, wenn er null von einer seiner Methoden zurückgibt. Dies ist die Methode, die der obigen Route entspricht:

@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;
}

Meine Frage ist: Ist es in Ordnung, eine 204: No Content Antwort zurückzugeben, oder sollte es stattdessen eine 404 Antwort sein, da die Ressource nicht gefunden wurde?

Wenn ich es in eine 404 ändern sollte, offensichtliche Frage: Ich sollte die Methodensignatur ändern, oder? Da jetzt ein Turnier (vom Typ Tournament) möglicherweise nicht zurückgegeben wird, sollte die Methode anders aussehen. Sollte ich stattdessen den Typ Response als Rückgabetyp verwenden?

15
dabadaba

HTTP 204 Bedeutet, dass etwas war gefunden wurde, aber es ist leer. Stellen Sie sich zum Beispiel vor, Sie ' Protokolldateien über HTTP mit Anforderungen wie http://example.com/logs/ [date-goes-here] bereitstellen. Am 18. Mai 2015:

  • http://example.com/logs/2015-05-19 würde HTTP 404 zurückgeben, was bedeutet, dass es keine Protokolle gibt, da es schwierig ist, die Zukunft zu protokollieren.

  • http://example.com/logs/2015-05-18 würde jedoch entweder HTTP 200 mit den Protokolleinträgen im Inhalt der Antwort oder HTTP 204 wenn die Protokolldatei erstellt wurde, für dieses Datum jedoch noch keine Protokolle aufgezeichnet wurden.

Wenn Sie dem Framework null als Antwort auf eine Anforderung bereitstellen, wird davon ausgegangen, dass Sie einen Eintrag gefunden haben und dieser Eintrag leer ist, also HTTP 204. Stattdessen sollten Sie throw new NotFoundException(); angeben, um dem Framework anzuzeigen, dass der Eintrag nicht vorhanden ist, damit ein HTTP 404 Erzeugt wird.

Wenn ich es in eine 404 ändern sollte, offensichtliche Frage: Ich sollte die Methodensignatur ändern, oder?

Nein, tust du nicht. Das ist das Schöne an throw new NotFoundException();. Es funktioniert unabhängig vom tatsächlichen Rückgabetyp Ihrer Methode.

32

Sie sollten eine 404 zurückgeben. Sie können dies tun, indem Sie eine NotFoundException auslösen ( https://jersey.Java.net/apidocs/2.6/jersey/javax/ws/rs/NotFoundException.html ).

Schauen Sie sich auch diese SO Frage an, wenn Sie den zurückgegebenen Inhaltstyp steuern möchten https://stackoverflow.com/questions/23858488/how-i-return-http-404) -json-xml-response-in-jax-rs-jersey-on-Tomcat

3
Chamindu

Ihre Anfrage ist GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39.

Wenn http://localhost:8080/eventscheduler/ Nicht als Endpunkt vorhanden ist, sollten Sie eine 404 zurückgeben. Sie versuchen, auf eine Ressource (/eventscheduler/) Zuzugreifen, die nicht vorhanden ist. Dies würde einem Client anzeigen, dass auf localhost:8080 Ein Server vorhanden ist, aber am eventscheduler -Endpunkt befindet sich nichts.

Wenn http://localhost:8080/eventscheduler/ Als Endpunkt vorhanden ist, die erforderlichen Ressourcen jedoch nicht verfügbar sind, ist ein 5xx-Fehler angebracht. Ein gutes Beispiel hierfür wäre, wenn eine Datenbank offline ist und Sie einen 503 zurückgeben könnten. Natürlich möchten Sie möglicherweise nur einen generischen 500-Fehler anstelle einer bestimmten Instanz zurückgeben.

Wenn http://localhost:8080/eventscheduler/ Existiert, aber das durch c15268ce-474a-49bd-a623-b0b865386f39 Dargestellte Ding nicht existiert, würde ich eine 200 mit einem Text zurückgeben, der die Details angibt. Der Endpunkt ist vorhanden, die Anfrage war vollständig gültig und konnte verarbeitet werden, es gab jedoch keine Übereinstimmung.

Wenn die Anfrage Ihres Kunden an den Endpunkt nicht gültig wäre, würden Sie sich die anderen 4xx-Fehler ansehen. Sie können angeben, dass der Client nicht berechtigt ist, auf den Endpunkt oder die mit einem 401 oder 403 angeforderten Elemente zuzugreifen, oder mit einem 400 angeben, dass die Anforderung ungültig ist. Mit all diesen können zusätzliche Informationen im Antworttext bereitgestellt werden.

1
Thomas Owens