Правильный ответ REST для пустой таблицы?

Предположим, вы хотите получить список пользователей, вызывая get до api/users, но в настоящее время таблица была усечена, поэтому пользователей нет. Каков правильный ответ для этого сценария 404 или 204?

Ответ 1

Я бы тоже сказал.

Почему не 404 (не найдено)?

Код статуса 404 должен быть зарезервирован для ситуаций, в которых ресурс не найден. В этом случае ваш ресурс представляет собой коллекцию пользователей. Эта коллекция существует, но в настоящее время она пуста. Лично я был бы очень смущен как автор клиента для вашего приложения, если бы я получил 200 один день и 404 на следующий день только потому, что кто-то удалил пару пользователей. Что я должен сделать? Неправильно ли мой URL-адрес? Кто-то изменил API и забыл оставить перенаправление.

Почему не 204 (без содержимого)?

Здесь выдержка из описание кода состояния 204 по w3c

Сервер выполнил запрос, но ему не нужно возвращать тело сущности и может захотеть вернуть обновленную метаинформацию.

Хотя это может показаться разумным в этом случае, я думаю, что это также смущает клиентов. Предполагается, что A 204 указывает, что некоторая операция выполнена успешно и данные не должны быть возвращены. Это идеально подходит для ответа на запрос DELETE или, возможно, для запуска script, который не нуждается в возврате данных. В случае api/users вы обычно ожидаете получить представление своей коллекции пользователей. Отправка тела ответа один раз и не отправка его в другое время является непоследовательной и потенциально вводящей в заблуждение.

Почему я использовал 200 (OK)

По причинам, упомянутым выше (согласованность), я бы вернул представление пустой коллекции. Предположим, вы используете XML. Обычный тело ответа для непустого набора пользователей может выглядеть так:

<users>
  <user>
    <id>1</id>
    <name>Tom</name>
  </user>
  <user>
    <id>2</id>
    <name>IMB</name>
  </user>
</users>

и если список пуст, вы можете просто ответить с чем-то вроде этого (при использовании 200):

<users/>

В любом случае клиент получает тело ответа, которое следует за определенным, хорошо известным форматом. Нет лишней путаницы и проверки кода состояния. Кроме того, не нарушено определение кода состояния. Все счастливы.

Вы можете сделать то же самое с JSON или HTML или любым другим форматом, который вы используете.

Ответ 2

Я бы ответил на один из двух кодов в зависимости от ситуации выполнения:

404 (не найдено)

Этот ответ довольно корректен, если у вас нет таблицы. Не только пустой стол, но и нет таблицы USER TABLE. Это подтверждает точную идею - никакого ресурса. Дальнейшие варианты - предоставить более подробную информацию. ПОЧЕМУ ваша таблица отсутствует, есть несколько более подробных кодов, но 404 довольно хорошо относится к ситуации, когда у вас действительно нет таблицы.

200 (OK)

Все случаи, когда у вас есть таблица, но она пуста или ваш процессор запросов отфильтровывает все результаты. Это означает, что ваш запрос верен, все в порядке, но вы не соответствуете данным, потому что либо у нас нет данных, либо у нас нет данных, которые соответствуют вашему запросу. Это должно отличаться от ответа на отказ в безопасности. Я также голосую, чтобы вернуть 200 в ситуации, когда у вас есть некоторые данные, и в целом вам разрешен доступ к таблице, но у вас нет доступа ко всем данным, которые соответствуют вашему запросу (данные были отфильтрованы из-за безопасности уровня объекта, но в целом вам разрешено запрос).

Ответ 3

Если вы ожидаете список объектов пользователя, лучшим решением является возврат пустого списка ([]), чем использование ответа 404 или 204.