it-swarm.com.de

Verwenden Sie 404 oder 200, wenn das Nullergebnis (REST)

Nehmen wir an, wir haben eine Entität

{
    "id": 1
    "inProgress": true,
}

Wir haben Endpunkte:

  • /api/v1/entities/ Zum Abrufen aller Entitäten,
  • /api/v1/entities/1 Zum Abrufen einer Entität mit id = 1
  • /api/v1/entities/in-progress Zum Abrufen einer laufenden Entität. Beachten Sie, dass nur eine Entität ausgeführt werden kann.

Jetzt können wir 2 Situationen für /api/v1/entities/in-progress Haben:

  1. es ist eine Entität in Bearbeitung
  2. derzeit ist keine Entität in Bearbeitung

Welcher Statuscode sollte für den 2. Fall zurückgegeben werden?

404 - Nicht gefunden

Sieht in Ordnung aus, da es keine Entität gibt. Auch für 404 sagt HTTP The requested resource could not be found but may be available again in the future. Subsequent requests by the client are permissible.

2

Sieht auch in Ordnung aus, da die Anfrage erfolgreich war, aber warum sollten wir ein Null-Ergebnis zurückgeben?

204

Anfrage erfolgreich, aber es gibt kein Ergebnis. Welches scheint auch in Ordnung zu sein.

Welchen Statuscode würden Sie verwenden und warum?

9
Maxian Nicu

HTTP-Statuscodes im Bereich 4xx weisen auf Clientfehler hin. Daher denke ich nicht, dass die Verwendung eines 404 hier anwendbar ist. Wenn Sie es als Clientfehler betrachten, sagen Sie auch, dass der Client Kenntnisse über den Status des Servers haben muss, was auf ein stark gekoppeltes Design hinweist.

Wie JimmyJames es schön in seinen Kommentaren formulierte,

404 bedeutet "Ich weiß nicht, worauf Sie sich beziehen". Dies unterscheidet sich stark von "Ich weiß genau, was Sie fragen, aber es gibt keine Daten."

Sie sagen jedoch, dass zu jedem Zeitpunkt nur eine Entität ausgeführt werden kann. Dies klingt nach einer Geschäftsregel. Wenn Sie nur ein Objekt in der URL zurückgeben möchten, spiegelt Ihre Benutzeroberfläche die Geschäftsregeln wider.

Ich würde vorschlagen, dass Sie erwägen, ein Array aus dem in-progress url. Dann können Sie übrigens ein Array mit entweder null oder einem Ergebnis erhalten.

Vielleicht ändern Sie dies sogar in eine Abfrage, also fragen Sie nach /api/v1/entities?in-progress=true

23
Pete