it-swarm.com.de

Richtige REST Antwort für leere Tabelle?

Angenommen, Sie möchten eine Benutzerliste abrufen, indem Sie get zu api/users Aufrufen, aber die Tabelle wurde derzeit abgeschnitten, sodass keine Benutzer vorhanden sind. Was ist die richtige Antwort für dieses Szenario 404 Oder 204?

94
IMB

Ich würde auch nicht sagen.

Warum nicht 404 (nicht gefunden)?

Der 404-Statuscode sollte für Situationen reserviert werden, in denen eine Ressource nicht 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 ein 200 eines Tages 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 es versäumt, eine Umleitung zu hinterlassen?.

Warum nicht 204 (kein Inhalt)?

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

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

Dies mag in diesem Fall vernünftig erscheinen, würde aber 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 -Anforderung oder als Auslösen eines Skripts, das keine Daten zurückgeben muss. Im Falle von api/users erwarten Sie normalerweise eine Darstellung Ihrer Benutzersammlung. Es ist inkonsistent und möglicherweise irreführend, einen Antworttext einmal und ein anderes Mal nicht zu senden.

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önnten Sie einfach mit so etwas antworten (während Sie immer noch ein 200):

<users/>

In beiden Fällen erhält ein Client einen Antworttext, der einem bestimmten, bekannten Format entspricht. Es gibt keine unnötige Verwechslungs- und Statuscodeprüfung. Außerdem wird keine Statuscodedefinition verletzt. Alle sind glücklich.

Sie können dasselbe mit JSON oder HTML oder mit jedem anderen verwendeten Format tun.

210
toniedzwiedz

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

404 (nicht gefunden)

Diese Antwort ist ziemlich richtig, wenn Sie keinen Tisch haben. Nicht nur eine leere Tabelle, sondern KEINE BENUTZERTABELLE. Es bestätigt die genaue Idee - keine Ressource. Weitere Optionen sind, mehr Details anzugeben. 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 leere Tabelle haben oder Ihr Anforderungsbearbeiter alle Ergebnisse herausgefiltert hat. Dies bedeutet, dass Ihre Anfrage korrekt ist, alles in Ordnung ist, aber Sie keine Daten abgleichen, nur weil entweder wir keine Daten haben oder wir keine Daten haben, die Ihrer Anfrage entsprechen. Dies sollte sich von der Sicherheitsverweigerungsantwort 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 anfordern).

13

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

8
geek

Es sollte 200 OK mit leerer Liste.

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

404 Not Found bedeutet, dass der angeforderte Endpunkt nicht existiert.

0
Amir Raza