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

59

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

  • 14
    Я бы ответил с 200 и пустой коллекцией (не пустое тело ответа, а скорее коллекция без элементов внутри, это будет выглядеть по-разному в зависимости от возвращаемого формата)
  • 4
    404 в этом контексте, вероятно, лучше подходит для «таблицы не найдены». Я бы сказал, вернуть пустой список.
Теги:
rest
http

3 ответа

135
Лучший ответ

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

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

  • 0
    Определенно согласен. А для REST я бы просто отправил обратно код состояния 200 с пустым массивом: [] .
  • 0
    Имеет смысл. Не нужно усложнять. 404 будет сбивать с толку.
Показать ещё 1 комментарий
5

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

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

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

200 (OK)

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

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню