Was ist der am besten geeignete HTTP-Statuscode für eine Fehlerseite "Element nicht gefunden"

117

Ich bin gespannt, welcher HTTP-Statuscode für eine Seite "Element existiert nicht" am besten geeignet ist.

Wenn die Seite selbst nicht vorhanden ist, verwende ich natürlich 404. Auf einer meiner Seiten befindet sich jedoch ein useridArgument (es handelt sich um eine Seite "Benutzer bearbeiten"). Falls kein Benutzer mit der angegebenen Benutzer-ID vorhanden ist, wird ein angezeigt Fehlerseite, aber ich möchte auch einen 4xx Status Header senden (da "200 OK" nicht wirklich passt).

Ich denke, 404 wäre in Ordnung, da es "nicht gefunden" und nicht "Datei nicht gefunden" ist, aber ich frage mich, ob es für diesen Fall einen besseren Code gibt.

DiebMaster
quelle

Antworten:

139

Es ist eine schlechte Idee, mit obskuren HTTP-Fehlercodes übermäßig schlau zu werden. Browser reagieren manchmal auf nicht hilfreiche Weise, die die Situation verschleiern. Bleib bei 404.

bmargulies
quelle
14
Verdammt, dass Sie gute Ratschläge gegeben haben :( Die OCD, nicht alle Dinge
Carrie Kendall
16
404-Fehler sind etwas mehrdeutig, um einen fehlerhaften URI von einer nicht gefundenen Entität zu unterscheiden. Ein neuer Standardcode wird benötigt, um 404s zu unterscheiden.
Breakskater
2
Ich ziehe es vor, 204 leere Inhalte zurückzugeben, als einen Ambigus-Statuscode zurückzugeben
hsnslh
45

Ein 404-Rückkehrcode bedeutet tatsächlich "Ressource nicht gefunden" und gilt für jede Entität, für die eine Anforderung gestellt, aber nicht erfüllt wurde. Es funktioniert also genauso gut für Seiten, Unterabschnitte von Seiten und alle Elemente, die auf der Seite vorhanden sind und für die eine bestimmte Anforderung zum Rendern besteht.

404 ist also der richtige Code für dieses Szenario. Beachten Sie, dass dies nicht für "Server nicht gefunden" gilt. Dies ist eine andere Situation, in der eine Anforderung ausgegeben, aber überhaupt nicht beantwortet wurde, als beantwortet, jedoch ohne die angeforderte Ressource.

Acht-Bit-Guru
quelle
1
Was ist, wenn ich das foo-Objekt mit id = 1 aktualisieren möchte und die Datenbank kein foo mit dieser ID enthält?
Valijon
1
In diesem Szenario muss ein Parallelitätsproblem behoben werden: Wenn Sie ein Objekt mit der ID = 1 abgerufen haben und es beim Versuch, es zu aktualisieren, nicht mehr vorhanden ist, hat ein anderer Thread oder Prozess Ihre Sperre ignoriert (oder Sie haben keine festgelegt). und löschte es. Das ist nicht gut. Wenn Sie alternativ versuchen, die Objekt-ID = n (wobei n bereitgestellt wird) zu aktualisieren, ohne zuvor zu überprüfen, ob sie vorhanden ist, fehlt ein Validierungsschritt in Ihrer Aktualisierungslogik, der ebenfalls nicht gut ist.
Acht-Bit-Guru
8

Dies hängt davon ab, ob die Benutzer-ID eine Ressourcenkennung oder ein zusätzlicher Parameter ist. Wenn dies der Fall ist, ist es in Ordnung, 404 zurückzugeben, wenn nicht, können Sie einen anderen Code wie zurückgeben

400 (bad request) ‐ indicates a bad request
oder
412 (Precondition Failed) e.g. conflict by performing conditional update

Weitere Informationen im kostenlosen InfoQ Explores: REST- Buch.

cetnar
quelle
1
Mit "zusätzlicher Parameter" meinen Sie das Anforderungsheaderfeld? Andernfalls würde ich die Verwendung von 412 nicht empfehlen. "Der Statuscode 412 (Vorbedingung fehlgeschlagen) gibt an, dass eine oder mehrere Bedingungen in den Anforderungsheaderfeldern beim Testen auf dem Server als falsch bewertet wurden."
oferei