Ich beschreibe ein Beispiel:
Ich beginne, eine API für eine Bäckerei zu erstellen. Mit der API können Benutzer ihren Katalog nach Backwaren durchsuchen, beispielsweise nach hausgemachten Minz-Schokoladenkeksen api.examplebakery.com/search?q=.....
.
Jemand sucht auf diese Weise nach einem Produkt mit dem Namen pineapple-banana flavoured cookies
und findet offensichtlich keine Ergebnisse.
Sollte dies als Fehler zurückgegeben werden? Die Suche ist nicht fehlgeschlagen, die API hat gesucht und erfolgreich festgestellt, dass keine Cookies gefunden wurden. Die API sollte nicht zurückgegeben werden 404
, da die API tatsächlich gefunden wurde.
rest
http-response
Berry M.
quelle
quelle
Antworten:
Wenn Ergebnisse vorliegen, handelt es sich bei der Ausgabe um eine Liste (JSON, basierend auf Ihrem Kommentar). Bei Abfragen ohne Ergebnisse sollte die Ausgabe genau gleich sein. Die Liste simple enthält 0 Elemente.
Wenn Ihre Antwort normalerweise so lautet:
Dann sollte es für eine Abfrage mit 0 Ergebnissen sein:
Wenn Sie auch Metadaten dazu hinzufügen, wie viele "Seiten" der Ergebnisse vorhanden sind, Links zu diesen "Seiten" usw., dann würde ich vorschlagen, dass 1 "Seite" vorhanden ist.
Der HTTP-Status sollte derselbe sein wie bei Ergebnissen -
200 OK
.204 No Content
scheint auch eine Option zu sein, liegt aber nicht daran, dass Sie tatsächlich "Inhalt" - die leere Liste - zurückgeben. Wenn Sie der Meinung sind, dass eine leere Liste nicht als "Inhalt" gilt, ändern Sie dann die Antwort, um Vorschläge für die Rechtschreibung anzubieten? Der Kern der Antwort wird immer noch eine leere Liste sein, aber jetzt gibt es noch mehr "Inhalt".Für weitere nützliche Informationen zu HTTP-Statuscodes ist jpmc26 ihre Antwort lesenswert.
quelle
Wenn Sie sich für einen HTTP-Code entscheiden, sollten Sie immer diese Frage stellen:
Entscheiden Sie immer, in welchem Bereich sich Ihr Antwortcode zuerst befinden soll. Wenn Sie so schnell vorgehen, werden viele Antwortcodes als Optionen eliminiert, und (was vielleicht noch wichtiger ist) das Befolgen der Semantik der Codes wird viel einfacher. In den Anfangsabschnitten der HTTP-Codedokumentation finden Sie Erläuterungen zu den einzelnen Codekategorien.
In diesem Fall hat der Client eine Liste der Ergebnisse angefordert, denen ein Filter von einem gültigen, vorhandenen Endpunkt zugewiesen wurde, und er hat die Berechtigung, darauf zuzugreifen. Der Server konnte die Anforderung verarbeiten und die entsprechenden zurückzugebenden Daten (keine Elemente) ermitteln, sodass die Anforderung erfolgreich war. Es passiert einfach, dass der Filter, den sie gaben, alle Ergebnisse herausfilterte . Es ist nicht Sache des Servers, zu bestimmen, ob der Client dies wünscht oder nicht, da dies für einige Clients ein erwartetes Ergebnis sein kann. Wenn es sich um ein Problem mit dem Client-Code handelt, liegt es in der Verantwortung des Clients, dies zu ermitteln, zu überprüfen und entsprechend zu behandeln. Das ist also eindeutig 2xx.
Nun lautet die Frage: "Welche 2xx?" Dies hängt davon ab, wie der Server reagieren soll.
Die anderen sind überhaupt nicht anwendbar:
Es sollte also entweder 200 oder 204 sein, und 200 führt mit größerer Wahrscheinlichkeit zu einfacherem, robusterem Clientcode (insbesondere, wenn Sie eine konsistente Antwortstruktur mit einer leeren Liste verwenden).
quelle
null
einer Liste), können Sie die Vorteile der Konsistenz auch mit 200 nicht nutzen. Ich beschreibe jedoch die Verwendung von a Antwort, die mit der normalen Struktur übereinstimmt und eine leere Liste enthält, in die die Liste der Ergebnisse normalerweise passt. 204 nimmt jede Gelegenheit, um eine solche konsistente Antwort zu haben. Auch in HTTP-Client-Bibliotheken, die über praktische Funktionen verfügen, müssen Sie häufig (normalerweise?) Einen expliziten Aufruf zum Parsen von JSON ausführen.Nein. Die Verwendung von 404, um anzuzeigen, dass Ihre Anfrage verarbeitet wurde, aber keine Übereinstimmungen gefunden wurden, ist schrecklich, weil:
Bedingter Ablauf basierend auf Ausnahmebehandlung (dh Erzwingen eines nicht außergewöhnlichen Ergebnisses, um eine Ausnahme im Client zu erstellen und zu behandeln, die nicht performant und umständlich sein kann)
Mehrdeutigkeit zwischen "realer" Seite nicht gefunden, Sie haben den Endpunkt falsch eingegeben
Beachten Sie, dass es immer einen Client gibt, der die Nachricht deserialisiert, und es ist wichtig, was dieser Client zurückgibt. nicht die serialisierung.
Wenn der Client null zurückgeben soll, verwenden Sie die Serialisierung von null. Wenn der Client ein leeres Array zurückgeben soll, verwenden Sie []. Wenn der Client einen Fehler auslösen soll, verwenden Sie 500 und übergeben Sie die Fehlermeldung
quelle
Beyond @ Ewans sehr gute Antwort:
Wenn es sich bei der Abfrage um eine Art Abfrage handelt, die eine Reihe von Ergebnissen zurückgibt, ist die leere Reihe logisch genauso geeignet wie eine Reihe von einer oder mehreren. Im Allgemeinen ist es aus den Gründen, die @Ewan angibt, mehr schädlich als nützlich, die leere Menge in einen Fehler umzuwandeln, und es ist einfach unnötig.
Wenn es sich bei der Abfrage um eine Art Abfrage handelt, die nach einem bestimmten Singleton sucht und diesen zurückgibt (von dem erwartet wird, dass er gefunden wird, z. B. exakte Übereinstimmung mit der ID), ist "Nicht gefunden" eine logisch angemessene mögliche Antwort.
quelle
Sie gehen davon aus, dass der Code eine spezielle Aktion ausführen muss, wenn keine Daten zurückgegeben werden. Dies ist jedoch möglicherweise nicht der Fall. Der Code sucht einfach nach einer Produktanzahl oder hängt die Ergebnisse an eine Liste oder eine beliebige Anzahl von Dingen an. Sie sollten einem Benutzer nur dann einen "Fehler" melden, wenn tatsächlich ein Fehler vorliegt.
quelle
Wenn ich eine API verwende, muss ich als Client "Erfolgs" -Fälle behandeln, die sich von "Fehler" -Fällen unterscheiden. Ich habe dort keine Wahl. Daher sollten Sie einen Fehler in Situationen zurückgeben, die der Client anders behandeln möchte , und einen Erfolg in Situationen, die der Client gleich behandeln möchte .
Wenn ich eine Abfrage durchführe, die theoretisch eine beliebige Anzahl von Ergebnissen (null, eins, zweihundert usw.) zurückgeben kann, sollten Sie "success" zurückgeben, wenn die API die vollständige Liste aller Ergebnisse liefert. Und in Fällen, in denen es viele Ergebnisse gibt, haben Sie möglicherweise eine Teilliste mit Ergebnissen zurückgegeben, um eine übermäßige Größe zu vermeiden, und es gibt einen vereinbarten Weg, wie ich die anderen Ergebnisse erhalten würde. Das liegt daran, dass ich als Kunde häufig den Fall von Null-Ergebnissen wie den Fall von mehr Ergebnissen behandeln möchte. Ich würde es vielleicht anders behandeln, aber ich möchte nicht dazu gezwungen werden.
Anders ist es in dem Fall, dass ich einen Wert nachschlage. Ich erwarte genau ein Ergebnis, den Wert, den ich suche. Und ich brauche dieses eine Ergebnis, um das, was ich tun möchte, sinnvoll fortzusetzen. Hier ist es viel akzeptabler, einen Status 404 für den Fall zurückzugeben, dass kein Wert vorhanden ist, da ich diesen Fall ohnehin anders behandeln muss.
Zusammenfassung: Wenn der Client eine beliebige Anzahl von Ergebnissen erwartet, von Null bis zu großen Zahlen, wird "Erfolg" zurückgegeben, wenn alle Ergebnisse geliefert werden, auch wenn die Zahl Null ist. Wenn der Client genau ein Ergebnis erwartet, geben Sie Erfolg zurück, wenn das Ergebnis gefunden wird, und einen Fehler, wenn das Ergebnis nicht gefunden wird.
quelle