Richtige REST-Antwort für leere Tabelle?

106

Angenommen, Sie Liste der Benutzer erhalten möchten durch den Aufruf GETzu api/users, aber zur Zeit wurde die Tabelle abgeschnitten , so dass keine Benutzer sind. Was ist die richtige Antwort für dieses Szenario: 404oder 204?

IMB
quelle
19
Ich würde mit 200 und einer leeren Sammlung antworten (kein leerer Antworttext, sondern eine Sammlung ohne Elemente, dies wird je nach zurückgegebenem Format unterschiedlich aussehen)
toniedzwiedz
4
404 wäre in diesem Zusammenhang wahrscheinlich besser geeignet für "Tabelle nicht gefunden". Ich würde sagen, eine leere Liste zurückgeben.
Mata
2
@EJoshuaS Es ist nicht. Beide Fragen sind meine und sehr alt. Sie sind ähnlich, aber keine Duplikate.
IMB
1
@EJoshuaS Sie sind offensichtlich keine Duplikate. Diese Frage ist etwa , /api/userswährend , dass man über /api/users/1.
Franklin Yu

Antworten:

231

Ich würde auch nicht sagen.

Warum nicht 404 (nicht gefunden)?

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

Warum nicht 204 (kein Inhalt)?

Hier ist ein Auszug aus der Beschreibung des 204-Statuscodes von w3c

Der Server hat die Anforderung erfüllt, muss jedoch keinen Entitätskörper zurückgeben und möchte möglicherweise aktualisierte Metainformationen zurückgeben.

Dies mag in diesem Fall vernünftig erscheinen, aber ich denke, es würde auch die Kunden verwirren. A 204soll anzeigen, dass eine Operation erfolgreich ausgeführt wurde und keine Daten zurückgegeben werden müssen. Dies ist perfekt als Antwort auf eine DELETEAnfrage oder als Auslösen eines Skripts, das keine Daten zurückgeben muss. In diesem Fall api/userserwarten Sie normalerweise eine Darstellung Ihrer Benutzersammlung. Das einmalige Senden eines Antwortkörpers und das nicht anderweitige Senden ist inkonsistent und möglicherweise irreführend.

Warum ich eine 200 verwenden würde (OK)

Aus den oben genannten Gründen (Konsistenz) würde ich eine Darstellung einer leeren Sammlung zurückgeben. Nehmen wir an, Sie verwenden XML. Ein normaler Antworttext 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önnen Sie einfach mit so etwas antworten (während Sie noch a verwenden 200):

<users/>

In beiden Fällen erhält ein Client einen Antworttext, der einem bestimmten, bekannten Format folgt. Es gibt keine unnötige Verwirrung und Überprüfung des Statuscodes. Außerdem wird keine Statuscode-Definition verletzt. Jeder ist glücklich.

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

toniedzwiedz
quelle
4
Stimme definitiv zu. Und für REST würde ich einfach einen Statuscode von 200 mit einem leeren Array zurücksenden : [].
Chad Johnson
Macht Sinn. Keine Notwendigkeit, es schwieriger zu machen. 404 wäre verwirrend.
Witold Kaczurba
Nehmen wir eine API an, die Münzen in Ihrer Tasche mit Endpunkten beschreibt: GET /singleCoin- Gibt zufällige GET /severalCoinsEinzelmünzen aus Ihrer Tasche zurück , - Gibt einige Münzen aus Ihrer Tasche zurück, die Sie auf einmal greifen können. Nehmen wir an, Sie haben derzeit keine Münzen in der Tasche. Wenn Sie darum bitten, erhalten GET /singleCoinSie 404 Not Found, aber wenn Sie darum bitten, erhalten GET /severalCoinsSie eine 200 OKleere Liste []. Eine Tatsache - Sie haben keine Münzen, die mit unterschiedlichen Antworten beschrieben wurden. Warum? Ich würde sagen, es ist besser, immer zu bekommen 404 Not Found, weil keine Münzen in Ihrer Tasche gefunden werden.
Sempasha
1
@sempasha Es kommt darauf an, was du meinst GET /severalCoins. Wenn Sie das Mandat GET /severalCoins muss ein paar Münzen zurückgeben , dann sollte es nicht mehr als 200 sein , weil es nicht in Ordnung ist; Der Server konnte nicht angeben, was der Client möchte. Für /singleCoindiese liegt auf der Hand , weil Client genau eine Münze wollen, nicht mehr, nicht weniger. Dies gilt auch für /coins/7. Im Gegensatz zum /coinsEndpunkt erwarten Kunden normalerweise keine Münze, eine Münze oder mehrere Münzen. Alle von ihnen sind gültige Antwort. Wenn es keine Münze gibt, dann ist es das, was sie wollen. Es ist wie ein Mitarbeiter List<Coin>in Java statt null.
Franklin Yu
15

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

404 Nicht gefunden)

Diese Antwort ist ziemlich richtig, wenn Sie keine Tabelle haben. Nicht nur eine leere Tabelle, sondern KEINE BENUTZERTABELLE. Es bestätigt die genaue Idee - keine Ressource. Weitere Optionen sind, mehr Details bereitzustellen. WARUM Ihre Tabelle fehlt, gibt es einige detailliertere Codes, aber 404 ist ziemlich gut, um auf Situationen hinzuweisen, in denen Sie wirklich keine Tabelle haben.

200 (OK)

Alle Fälle, in denen Sie eine Tabelle haben, diese jedoch leer ist oder Ihr Anforderungsprozessor alle Ergebnisse herausgefiltert hat. Dies bedeutet, dass Ihre Anfrage korrekt ist, alles in Ordnung ist, Sie jedoch keine Daten abgleichen, nur weil entweder wir keine Daten haben oder keine Daten, die Ihrer Anfrage entsprechen. Dies sollte sich von der Antwort auf Sicherheitsverweigerung unterscheiden. Ich stimme auch dafür, 200 zurückzugeben, wenn Sie einige Daten haben und im Allgemeinen auf die Tabelle zugreifen dürfen, aber keinen Zugriff auf alle Daten haben, die Ihrer Anfrage entsprechen (Daten wurden aus Sicherheitsgründen auf Objektebene herausgefiltert, aber im Allgemeinen dürfen Sie dies Anfrage).

Roman Nikitchenko
quelle
10

Wenn Sie eine Liste mit Benutzerobjekten erwarten, ist die beste Lösung, eine leere Liste ([]) mit 200 OK zurückzugeben, als eine 404- oder eine 204-Antwort zu verwenden.

Geek
quelle
2

gibt definitiv 200 zurück.

404 bedeutet, dass die Ressource nicht gefunden wurde. Aber die Ressource existiert. Und auch, wenn die Antwort den Status 404 hat. Woher wissen Sie, dass die Benutzerliste leer oder gefüllt ist?


  • Wenn '/ users' leer ist, sollte '200' zurückgegeben werden.
  • '/ users / 1', wenn die ID nicht gefunden wird. sollte 404 zurückgeben.
Liva
quelle
2

Es muss 200 OK sein mit leerer Liste sein.

Warum: Leere Tabelle bedeutet, dass die Tabelle vorhanden ist, aber keine Datensätze enthält.

404 Nicht gefunden bedeutet, dass der angeforderte Endpunkt nicht vorhanden ist.

Amir Raza
quelle