Ответ 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 или любым другим форматом, который вы используете.