Предположим, вы хотите получить список пользователей, вызывая get
до api/users
, но в настоящее время таблица была усечена, поэтому пользователей нет. Каков правильный ответ для этого сценария 404
или 204
?
Правильный ответ REST для пустой таблицы?
Ответ 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.