Для вашего конкретного примера я бы порекомендовал, чтобы / v1 / get / books возвращал HTTP 200 с пустым массивом.
Если я правильно читаю ваш пост, ваш API собирается собирать книги. Говоря метафорически, у вас есть книжная полка для книг, стойка для DVD для фильмов и, возможно, другие контейнеры, о которых вы здесь не упоминали. Поскольку вы намерены собирать книги, / v1 / get / books - это ваша книжная полка. Это означает, что там есть действительный ресурс - список книг, который в вашем конкретном примере оказался пустым.
Причина, по которой я не предлагаю возвращать HTTP 404 в этом случае, заключается в том, что книжная полка все еще там. На данный момент на нем нет книг, но это все еще книжная полка. Если бы это не была книжная полка - если API, например, не собирался собирать книги - тогда HTTP 404 подойдет. Но поскольку там есть ресурс, вы не должны сигнализировать, что его нет, что делает HTTP 404. Поэтому я утверждаю, что 200 с пустым массивом (означающим коллекцию) является более подходящим.
Причина, по которой я не предлагаю возвращать HTTP 204, заключается в том, что это означает, что «Нет содержимого» является обычным делом: выполнение этого действия на этом ресурсе обычно ничего не возвращает. Вот почему он обычно используется в качестве ответа на запросы DELETE, например: характер удаления обычно означает, что возвращать нечего. Аналогичный случай, когда он используется для ответа на запросы с семейством заголовков If-Modified: вы хотели контент только в том случае, если ресурс изменился, но это не так, поэтому я не дам вам никакого контента.
Но я утверждаю, что для получения пустой, но действительной коллекции HTTP 204 не имеет смысла. Если бы в коллекции были элементы, то правильным представлением был бы массив этих данных. Поэтому, когда там нет данных (но коллекция действительна), правильным представлением является пустой массив.