Was ist ein richtiger Antwortstatuscode für POST, wenn keine übergeordnete Ressource gefunden wird?

10

Ich habe den folgenden Endpunkt:

a/{id}/b

und möchten eine bmit sendende POSTAnfrage an sie erstellen . Wenn amit gegeben {id}nicht gefunden wird, soll ich mit 404 NOT_FOUNDoder vielleicht mit antworten 409 CONFLICT?

Es ist einfach zu handhaben a/{id}, der Trick ist, dass hier eine Unterressource verwendet wird.

Opal
quelle

Antworten:

15

404 NOT FOUNDscheint die richtige Antwort zu sein, da die Ressource mit dieser ID nicht vorhanden ist. Es ist sehr klar zu verstehen und Sie erwarten die gleiche Antwort, wenn a/{id}aufgerufen wird.

409 CONFLICTscheint mir nicht die bessere Wahl zu sein, da Sie in Ihrem Beispiel eine 409 zurückgeben, wenn die übergeordnete Ressource nicht gefunden wurde :).

Denken Sie jedoch daran, dass das Wichtigste darin besteht, in Ihrer API konsistent zu sein

Dherik
quelle
Genau. Wenn Sie versuchen, in einen nicht vorhandenen Ordner zu schreiben, liegt ein Konflikt oder ein fehlender Ordnerfehler vor? Auf diese Weise erscheint es mir intuitiver.
Neil
Ein "Ordner" meinst du einen Pfad, der nicht existiert?
Dherik
Ich meine einen Ordner, wie im Dateisystem.
Neil
Können Sie das Szenario detailliert beschreiben? Weil es darauf ankommt. Wenn der Ordner für den Server und (warum auch immer) zu erwarten war nicht da ich denke , das ist ein Server - Fehler (5xx) keine Client - Fehler (4xx). Wenn dieser Ordnerwert vom Client an die Ressource (als id) übergeben wurde, ist er 404. Wenn der Ordner jedoch im Hauptteil übergeben wurde, kann dies alles andere sein (412, 422 ... etwas, das "Validierung fehlgeschlagen: Ordner tut dies" darstellt existiert nicht"). Es ist eine gute Frage zu stellen und zu diskutieren.
Dherik
Wenn Sie den Server nach einer Datei mit dem Pfad /nonexistent/help.html fragen und der Ordner / nonexistent nicht vorhanden ist, gibt es nur eine eindeutige Antwort darauf. 404 Datei nicht gefunden! Es könnte sogar eine /home/help.html existieren, und die Antwort würde sich nicht unterscheiden. Dies ist eindeutig eine REST-Anwendung, aber ich sehe keinen Grund, warum sich die Logik ändern würde. Der Elternteil muss zuerst existieren.
Neil
4

Zusätzlich zu @ Dheriks Antwort.

URIs sind Bezeichner , daher müssen wir berücksichtigen, dass ( /a/{id}/bein Bezeichner ist). Der URI ist für das WWW und für den HTTP-Client bedeutungslos.

404 ist die richtige Antwort . Im Wesentlichen antwortet der Server

Ich habe keine Ressource mit einer solchen ID gefunden. Ressource nicht gefunden 1

Ob die fehlende Ressource übergeordnet oder untergeordnet ist, spielt keine Rolle.

Wir Entwickler sehen Hierarchien und Pfade in der URI, HTTP-Clients jedoch nicht. Mit anderen Worten, HTTP soll nur von HTTP-Clients interpretiert werden, nicht jedoch von Menschen (Entwicklern, Endbenutzern usw.).

Fragen Sie im Zweifelsfall nicht, welcher Code für Sie (Mensch) sinnvoll ist. Fragen Sie, welcher Code für den HTTP-Client sinnvoll ist. Wie soll sich der HTTP-Client verhalten?

Warum? Weil ein Statuscode diese Clients dazu veranlasst, bestimmte Vorgänge auszuführen. Zum Beispiel 302 . Mit diesem Code können Webbrowser normalerweise zu einem bestimmten Speicherort (URI) umleiten, der in den Antwortheadern angegeben ist.

Dies ist möglicherweise nicht Ihr Fall, aber es ist wichtig, sich dessen bewusst zu sein. Letztendlich werden HTTP-Statuscodes an HTTP-Clients adressiert. Nicht zu unseren Anwendungen. Nicht an Personen.


1: 409 wird selten als Navigationsfehler implementiert. In der Regel werden Remote-Vorgänge ausgeführt (Löschen, Aktualisieren, Neu usw.). Aber die URI sollte existieren. Andernfalls wird sich 404 durchsetzen

Laiv
quelle