Frage Richtige REST-Antwort für leere Tabelle?


Nehmen wir an, Sie möchten eine Liste von Benutzern abrufen, indem Sie anrufen get zu api/users aber zur Zeit wurde die Tabelle abgeschnitten, so dass es keine Benutzer gibt. Was ist die richtige Antwort für dieses Szenario? 404 oder 204?


75
2017-11-13 18:43


Ursprung


Antworten:


Ich würde auch nicht sagen.

Warum nicht 404 (nicht gefunden)?

Der 404-Statuscode sollte für Situationen reserviert sein, in denen eine Ressource nicht gefunden wird. In diesem Fall ist Ihre Ressource eine Sammlung von Benutzern. Diese Sammlung existiert, aber sie ist derzeit leer. Persönlich wäre ich als Autor eines Kunden für Ihre Bewerbung sehr verwirrt, wenn ich eine 200 ein Tag und ein 404 am nächsten Tag, nur weil jemand zufällig ein paar Benutzer entfernt hat. Was soll ich machen? Ist meine URL falsch? Hat jemand die API geändert und eine Umleitung vernachlässigt?

Warum nicht 204 (Kein Inhalt)?

Hier ist ein Auszug aus die Beschreibung des 204 Statuscodes durch w3c

Der Server hat die Anforderung erfüllt, muss jedoch keinen Entity-Body zurückgeben und möchte möglicherweise aktualisierte Metainformationen zurückgeben.

Obwohl dies in diesem Fall vernünftig erscheint, würde es meines Erachtens auch die Kunden verwirren. EIN 204 soll anzeigen, dass eine Operation erfolgreich ausgeführt wurde und keine Daten zurückgegeben werden müssen. Dies ist perfekt als Antwort auf eine DELETE Anfrage oder vielleicht feuern ein Skript, das keine Daten zurückgeben muss. Im Falle von api/usersNormalerweise erwarten Sie eine Darstellung Ihrer Benutzersammlung. Wenn Sie einen Antworttext einmal senden und ihn nicht zum anderen Mal senden, ist das inkonsistent und potenziell irreführend.

Warum würde ich eine 200 (OK) verwenden

Aus den oben genannten Gründen (Konsistenz) würde ich eine Darstellung einer leeren Sammlung zurückgeben. Angenommen, Sie verwenden XML. Ein normaler Antworttextkörper für eine nicht leere Sammlung von Benutzern könnte folgendermaßen aussehen:

<users>
  <user>
    <id>1</id>
    <name>Tom</name>
  </user>
  <user>
    <id>2</id>
    <name>IMB</name>
  </user>
</users>

und wenn die Liste leer ist, könntest du einfach mit so etwas antworten (während du immer noch a 200):

<users/>

In jedem Fall erhält ein Client einen Antworttext, der einem bestimmten, bekannten Format folgt. Es gibt keine unnötige Verwirrung und Statuscodeüberprüfung. Außerdem wird keine Statuscodedefinition verletzt. Jeder ist glücklich.

Sie können dasselbe mit JSON oder HTML oder einem anderen von Ihnen verwendeten Format tun.


156
2017-11-13 19:14



Ich würde je nach Laufzeitsituation einen von zwei Codes beantworten:

404 Nicht gefunden)

Diese Antwort ist ziemlich korrekt, wenn Sie keine Tabelle haben. Nicht nur leere Tabelle, sondern KEINE USER TABLE. Es bestätigt die genaue Idee - keine Ressource. Weitere Optionen sind weitere Details. WARUM dein Tisch abwesend ist, gibt es ein paar detailliertere Codes, aber 404 ist ziemlich gut, um auf Situationen zu verweisen, in denen du wirklich keinen Tisch hast.

200 (OK)

Alle Fälle, in denen Sie eine Tabelle haben, aber sie ist leer oder Ihr Anfrageprozessor hat alle Ergebnisse herausgefiltert. Das bedeutet: "Ihre Anfrage ist korrekt, alles ist in Ordnung, aber Sie stimmen mit keinen Daten überein, nur weil wir entweder keine Daten haben oder keine Daten haben, die Ihrer Anfrage entsprechen. Dies sollte sich von der Sicherheitsabweisung unterscheiden. Ich stimme auch für die Rückgabe von 200 in einer Situation, in der Sie einige Daten haben und generell auf Tabellen zugreifen können, aber keinen Zugriff auf alle Daten haben, die Ihrer Anfrage entsprechen (Daten wurden aufgrund der Sicherheit auf Objektebene herausgefiltert, aber im Allgemeinen dürfen Sie anfordern).


7
2018-02-13 22:16



Wenn Sie eine Liste mit Benutzerobjekten erwarten, gibt die beste Lösung eine leere Liste ([]) zurück als die Verwendung einer 404- oder 204-Antwort.


4
2018-05-08 23:30