Für Ihr spezielles Beispiel würde ich empfehlen, dass / v1 / get / books HTTP 200 mit einem leeren Array zurückgibt.
Wenn ich Ihren Beitrag richtig lese, beabsichtigt Ihre API, Bücher zu sammeln. Bildlich gesprochen haben Sie ein Bücherregal für Bücher, ein DVD-Regal für Filme und möglicherweise andere Behälter, die Sie hier nicht erwähnt haben. Weil Sie vorhaben, Bücher zu sammeln, ist / v1 / get / books Ihr Bücherregal. Dies bedeutet, dass es dort eine gültige Ressource gibt - eine Liste von Büchern -, die in Ihrem speziellen Beispiel leer ist.
Der Grund, warum ich nicht vorschlage, HTTP 404 in diesem Fall zurückzugeben, ist, dass das Bücherregal noch vorhanden ist. Momentan gibt es keine Bücher darüber, aber es ist immer noch ein Bücherregal. Wenn es nicht ein Bücherregal -wenn die API nicht zu sammeln Bücher die Absicht hatte, für Beispiel- dann HTTP 404 angebracht wäre. Aber weil es dort eine Ressource gibt, sollten Sie nicht signalisieren, dass es keine gibt, was HTTP 404 tut. Daher argumentiere ich, dass 200 mit einem leeren Array (das die Auflistung kennzeichnet) angemessener ist.
Der Grund, warum ich nicht vorschlage, HTTP 204 zurückzugeben, ist, dass dies darauf hindeutet, dass "Kein Inhalt" der normale Zustand ist: Wenn Sie diese Aktion für diese Ressource ausführen, wird normalerweise nichts zurückgegeben. Aus diesem Grund wird es normalerweise als Antwort auf DELETE-Anforderungen verwendet, z. B. bedeutet die Art des Löschens im Allgemeinen, dass nichts zurückgegeben werden muss. Ähnlich verhält es sich bei der Beantwortung von Anfragen mit der If-Modified-Familie von Headern: Sie wollten nur Inhalte, wenn sich die Ressource geändert hat, aber nicht. Deshalb werde ich Ihnen keine Inhalte geben.
Ich behaupte jedoch, dass HTTP 204 für das Abrufen einer leeren, aber gültigen Auflistung keinen Sinn ergibt. Wenn sich Elemente in der Auflistung befänden, wäre die richtige Darstellung ein Array dieser Daten. Wenn dort keine Daten vorhanden sind (aber die Auflistung gültig ist), ist die richtige Darstellung daher ein leeres Array.