HTTP-Statuscode in Microservices

Das ist ebenfalls schlicht falsch. Die Konvention ist, dass eine legitime Anfrage keinesfalls als nicht legitim (4xx) quittiert werden darf.

Das ist jetzt echt eine vertrackte Situation. Ist zufĂ€llig ein auf Existentialismus spezialisierter Philosoph anwesend? đŸ€Ș
 
@kali-hi Will jetzt hier nicht vom Thema wegfĂŒhren, aber ∅ und {∅} sind zwei verschiedene Dinge (∄ ist noch was kategorisch anderes). ∅ ist die (einzige) Menge, die keine Elemente hat, auch bekannt als leere Menge und {∅} ist eine einelementige Menge welche die leere Menge enthĂ€lt.
Generell scheint mir das den problematischen Punkt hier ganz gut zu treffen.
 
Von dem was ich hier (und auf der verlinkten StakOverflow-Diskussion) lese, gibt es doch eigentlich zwei prinzipielle Möglichkeiten:
  • Man betrachtet die Ressource als nicht vorhanden, ein GET darauf gibt 404. Der Client sollte nicht versuchen, ein GET auf die Ressource zu senden, bevor er nicht aus anderer Quelle weiß, dass die Ressource existiert.
  • Die Ressource ist vorhanden, aber leer. Man gibt wahlweise "null", "{}", "{null}" o.Ă€. zurĂŒck und Returncode 200. Der Client kann wie er lustig ist ein GET auf die Ressource starten, am Server ist sie ja fĂŒr alle existenten User immer vorhanden (aber halt leer.)
WĂ€re mal mein Ansatz.
 
  • GefĂ€llt mir
Reaktionen: H4110
BeBur schrieb:
{∅} ist eine einelementige Menge welche die leere Menge enthĂ€lt
Ja, sorry, ich meinte nicht {∅}, sondern {}. Also: ∅, {} oder Nil / ∄ / not exists.

Wikipedia kennt aber noch mehr: https://de.wikipedia.org/wiki/Liste_mathematischer_Symbole#Mengenlehre

Wie dem auch sei, ich wollte damit zeigen, das es fast keine semantischen Unterschiede zwischen den Schreibweisen mehr gibt, und somit zu einer Interpretationssache wird. Und bei den HTTP REST status return values verhÀlt sich dies Àhnlich.

  • 404 bedeutet einfach nur: Das Element (die Ressource) ist nicht da! Das bedeutet nicht, dort sollte aber etwas sein, dort könnte in Zukunft etwas sein, oder dort war in der Vergangenheit etwas.
  • 204 bedeutet (KI-Antwort) "No Content", also dass der Server die Client-Anfrage erfolgreich bearbeitet hat, aber keinen Inhalt in der Antwort zurĂŒcksendet. Dies ist typisch fĂŒr Aktionen wie das Löschen von Ressourcen oder das Aktualisieren von Daten, bei denen keine neuen Informationen zurĂŒckgegeben werden mĂŒssen, um den Erfolg der Anfrage anzuzeigen. Der Client sollte die Ansicht der Seite nicht Ă€ndern, sondern beibehalten.

204 wĂ€re fĂŒr mich nahe liegender, weil auch ein Erfolg der Anfrage (ValiditĂ€t) signalisiert wird.
 
  • GefĂ€llt mir
Reaktionen: BeBur
BeBur schrieb:
Wenn ich an Programmiersprachen denke, dann sollte eine Funktion, die etwas vom Typ T zurĂŒckliefert laut Interface auch wirklich ein gĂŒltiges T zurĂŒckliefert oder ansonsten etwas vom Typ optional<T> zurĂŒckliefern stattdessen.

Meine Intuition ist daher, das man nicht 200 + leere config zurĂŒckgeben sollte (default config, falls das sinn ergibt wĂ€re dieser Logik folgend aber natĂŒrlich okay).
Du zitierst einen Post, der eben die Problematik einer leeren RĂŒckgabe sogar beleuchtet und daher damit schließt, dass ein sinnvolles "hier ist leer" besser wĂ€re.

SheepShaver schrieb:
Das ist aber im Falle von REST APIs schlicht falsch. Die Konvention ist, dass das Abrufen einer nicht vorhandenen Resource mit einem 404 quittiert werden muss.
[citation needed]

Zudem REST als Konzept meines Wissens nach nirgend wirklich standardisiert wurde. Allenfalls gibt es da div. Quellen die ihre Konventionen aufgeschrieben. Daher ist "die Konvention" schlicht abenteuerlich.
Die HTTP Fehlercodes sind kein Teil von REST sondern HTTP und die aktuelle Norm dazu ist RFC9110.

Und da wĂ€ren wir dann wieder an dem Punkt. Nach Norm ist es richtig nicht vorhandene Ressourcen mit einem 404 zu beantworten. Es ist nur kein gutes Design einer API, wenn valide Endpunkte Fehler werfen und/oder RĂŒckgaben die sich von anderweitigen Fehlern nicht unterscheiden lassen.
 
  • GefĂ€llt mir
Reaktionen: kali-hi
Nö. Das ist ein erwartbarer Fehlerfall, genau wie 401 oder 403.
Der Client kann schlicht nicht wissen, ob eine Ressource ĂŒberhaupt existiert oder ob er Zugriff darauf hat. Deshalb muss er diese Antworten verarbeiten können.
Nach HTTP-Spec (RFC 9110) ist die Semantik eindeutig: Wenn eine Ressource nicht existiert, gehört ein 404 zurĂŒck. Wird der Zugriff verweigert, ist es ein 403. Fehlt eine gĂŒltige Authentifizierung, ist es ein 401.
Ein 200 mit leerem Body oder einer leeren Default-Config vermischt Semantik, erschwert Caching, Logging und Fehlerbehandlung und ist letztlich schlechtes API-Design. Wenn eine Collection vorhanden ist, aber gerade keine Elemente enthĂ€lt, dann ist ein 200 mit leerer Liste sinnvoll. Wenn ein Item nicht existiert, ist es ein 404. FĂŒr erfolgreiche Operationen ohne RĂŒckgabekörper ist ein 204 No Content vorgesehen.
Wer bei "nicht vorhanden" ein 200 liefert, bricht die HTTP-Semantik und macht dem Client das Leben unnötig schwer.

Kurzes Beispiel Upload einer Datei ĂŒber eine REST API:
Beim Preflight-Check vor einem Upload fragt der Client die gewĂŒnschte Datei an, zum Beispiel per HEAD /files/report.pdf. Bekommt er ein 200 OK, weiß er, dass die Datei bereits existiert und ein Upload sie ĂŒberschreiben wĂŒrde. Kommt dagegen ein 404 Not Found, bedeutet das eindeutig, dass die Ressource noch nicht existiert und der Upload eine neue Datei anlegt. Ein 403 Forbidden oder 401 Unauthorized signalisiert, dass der Zugriff nicht erlaubt ist. Genau hier zeigt sich, warum 404 sinnvoll ist: Der Client kann klar unterscheiden, ob er eine bestehende Version ĂŒberschreibt oder eine neue anlegt, anstatt mit einem leeren 200-Response im Unklaren zu bleiben.

Ansonsten: das Thema wurde in der Vergangenheit schon hinreichend und abschliessend ausdiskutiert:
https://stackoverflow.blog/2020/03/02/best-practices-for-rest-api-design/#h2-3f9e93268ff40
 
Zuletzt bearbeitet:
  • GefĂ€llt mir
Reaktionen: DHundt
SheepShaver schrieb:
Das sehe ich prinzipiell auch so, letztendlich ist es eine Designentscheidung/ Ermessenssache/ Team-Geblubber... Das hab ich aber auch schon in #18 angedeutet.

SheepShaver schrieb:
Ansonsten: das Thema wurde ... ausdiskutiert
auch schon in #18 angedeutet... letztendlich ist es ein Implementierungsdetail des Backends, um das sich der Client nicht kĂŒmmern muss... Der Client muss eigentlich nur "die grundsĂ€tzliche Flugrichtung" kennen, wohin die Reise gehen soll... also eher nur das Was, nicht das Wie (im ĂŒbertragenen Sinne).
 
SheepShaver schrieb:
Kurzes Beispiel Upload einer Datei ĂŒber eine REST API:
Beim Preflight-Check vor einem Upload fragt der Client die gewĂŒnschte Datei an, zum Beispiel per HEAD /files/report.pdf. Bekommt er ein 200 OK, weiß er, dass die Datei bereits existiert und ein Upload sie ĂŒberschreiben wĂŒrde. Kommt dagegen ein 404 Not Found, bedeutet das eindeutig, dass die Ressource noch nicht existiert und der Upload eine neue Datei anlegt. Ein 403 Forbidden oder 401 Unauthorized signalisiert, dass der Zugriff nicht erlaubt ist. Genau hier zeigt sich, warum 404 sinnvoll ist: Der Client kann klar unterscheiden, ob er eine bestehende Version ĂŒberschreibt oder eine neue anlegt, anstatt mit einem leeren 200-Response im Unklaren zu bleiben.
Da ist eine Race Condition drin.
 
  • GefĂ€llt mir
Reaktionen: kali-hi und H4110
Jo. Wenn man eine neue Datei hochlĂ€dt, sollte man POSTen, und wenn die wider erwarten bereits existiert, sollte der Server 409 liefern. Zum Überschreiben PUT mit If-Match oder If-Unmodified-Since (ETag bzw. Timestamp kann man sich vorher mit HEAD holen), und falls die Datei zwischenzeitlich geĂ€ndert wurde, sollte der Server 412 liefern.
 
Das Beispiele diente dazu, klarzustellen, dass ein 204 oder ein 200 mit einem Default-Payload eine schlechte Idee ist. Ein Ausflug in die Unterschiede von POST und PUT ist hier nicht zielfĂŒhrend.
 
ZurĂŒck
Oben