W twoim konkretnym przykładzie zaleciłbym, aby / v1 / get / books zwrócił HTTP 200 z pustą tablicą.
Jeśli dobrze czytam Twój post, Twój interfejs API zamierza zbierać książki. Mówiąc metaforycznie, masz półkę na książki, stojak na filmy DVD i ewentualnie inne pojemniki, o których tu nie wspomniałeś. Ponieważ zamierzasz zbierać książki, / v1 / get / books to twoja półka na książki. Oznacza to, że istnieje tam ważny zasób - lista książek - które w twoim przykładzie są puste.
Powodem, dla którego nie sugeruję zwracania HTTP 404 w tym przypadku jest to, że półka wciąż tam jest. W tej chwili nie ma na nim żadnych książek, ale nadal jest to półka na książki. Jeśli nie byłby to półka z książkami - jeśli API nie zamierzał na przykład zbierać książek - wtedy HTTP 404 byłby odpowiedni. Ale ponieważ istnieje tam zasób, nie powinieneś sygnalizować, że nie ma takiego zasobu, co robi HTTP 404. Dlatego twierdzę, że 200 z pustą tablicą (oznaczającą kolekcję) jest bardziej odpowiednie.
Powodem, dla którego nie sugeruję zwracania HTTP 204, jest to, że sugerowałoby to, że „Brak treści” jest zwykłym stanem rzeczy: wykonanie tej akcji na tym zasobie zwykle niczego nie zwróci. Dlatego jest zwykle używany jako odpowiedź na żądania DELETE, na przykład: charakter usunięcia ogólnie oznacza, że nie ma nic do zwrócenia. Sprawa jest podobna, gdy jest używana do odpowiadania na żądania za pomocą rodziny nagłówków If-Modified: chciałeś treści tylko, jeśli zasób się zmienił, ale nie zmienił się, więc nie dam ci żadnej treści.
Twierdzę jednak, że dla POBIERANIA pustej, ale poprawnej kolekcji, HTTP 204 nie ma sensu. Jeśli w kolekcji znajdują się elementy, poprawną reprezentacją będzie tablica tych danych. Dlatego, gdy nie ma tam żadnych danych (ale kolekcja jest poprawna), poprawną reprezentacją jest pusta tablica.