Допустим, вы хотите получить список пользователей, вызвав GET
к api/users
, но в данный момент таблица была обрезана , так что нет пользователей. Каков правильный ответ для этого сценария: 404
или 204
?
/api/users
а тот о /api/users/1
.
Допустим, вы хотите получить список пользователей, вызвав GET
к api/users
, но в данный момент таблица была обрезана , так что нет пользователей. Каков правильный ответ для этого сценария: 404
или 204
?
/api/users
а тот о /api/users/1
.
Ответы:
Я бы сказал, ни то, ни другое.
Код состояния 404 следует зарезервировать для ситуаций, в которых ресурс не найден. В этом случае ваш ресурс - это совокупность пользователей . Эта коллекция существует, но в настоящее время она пуста. Лично я, как автор клиента для вашего приложения, был бы очень сбит с толку, если бы получил 200
один день и 404
другой день только потому, что кто-то случайно удалил пару пользователей. Что я должен сделать? У меня неправильный URL? Кто-то изменил API и забыл оставить перенаправление.
Вот отрывок из описания кода статуса 204 от w3c
Сервер выполнил запрос, но не должен возвращать тело объекта и может захотеть вернуть обновленную метаинформацию.
Хотя в данном случае это может показаться разумным, я думаю, что это также запутает клиентов. 204
Предполагается, что символ A указывает на то, что некоторая операция была выполнена успешно и никаких данных возвращать не требуется. Это идеально подходит в качестве ответа на DELETE
запрос или, возможно, запуска какого-то скрипта, которому не нужно возвращать данные. В случае api/users
, вы обычно ожидаете получить представление о вашей коллекции пользователей. Отправлять тело ответа один раз и не отправлять его в другой раз - непоследовательно и потенциально вводит в заблуждение.
По причинам, указанным выше (согласованность), я бы вернул представление пустой коллекции. Предположим, вы используете XML. Обычное тело ответа для непустой коллекции пользователей может выглядеть так:
<users>
<user>
<id>1</id>
<name>Tom</name>
</user>
<user>
<id>2</id>
<name>IMB</name>
</user>
</users>
и если список пуст, вы можете просто ответить примерно так (при этом все еще используя a 200
):
<users/>
В любом случае клиент получает тело ответа в определенном хорошо известном формате. Нет ненужной путаницы и проверки кода состояния. Также не нарушается определение кода состояния. Все счастливы.
Вы можете сделать то же самое с JSON, HTML или любым другим форматом, который вы используете.
[]
.
GET /singleCoin
- возвращает случайную монету из вашего кармана, GET /severalCoins
- возвращает несколько монет из вашего кармана, которые вы можете схватить за один раз. Допустим, у вас сейчас нет монет в кармане. Когда вы попросите, GET /singleCoin
вы получите 404 Not Found
, но когда вы попросите, GET /severalCoins
вы получите 200 OK
пустой список []
. Один факт - у вас нет монет, описанных разными отзывами, почему? Я бы сказал, что лучше всегда получать 404 Not Found
, потому что в кармане нет монет.
GET /severalCoins
. Если мандат , который GET /severalCoins
должен вернуть несколько монет , то это не должно быть 200 , потому что это не в порядке; сервер не смог предоставить то, что хочет клиент. Для /singleCoin
этого, очевидно , потому что клиент не хочет ровно одну монету, не больше, не меньше. Это то же самое для /coins/7
. В отличие от /coins
конечной точки, обычно клиенты не ожидают монеты, одной монеты или нескольких монет. Все они верный ответ. Если монеты нет, то они этого хотят. Это похоже на emply List<Coin>
в Java вместо null
.
Я бы ответил на один из двух кодов в зависимости от ситуации во время выполнения:
404 Не Найдено)
Этот ответ довольно правильный, если у вас нет таблицы. Не просто пустая таблица, но НЕТ ТАБЛИЦЫ ПОЛЬЗОВАТЕЛЯ. Подтверждает точную идею - ресурса нет. Дополнительные параметры - предоставить более подробную информацию, ПОЧЕМУ ваша таблица отсутствует, есть несколько более подробных кодов, но 404 довольно хорошо подходит для ситуации, когда у вас действительно нет таблицы.
200 (ОК)
Все случаи, когда у вас есть таблица, но она пуста или ваш обработчик запросов отфильтровал все результаты. Это означает: «ваш запрос правильный, все в порядке, но вы не соответствуете никаким данным только потому, что либо у нас нет данных, либо нет данных, соответствующих вашему запросу». Это должно отличаться от ответа об отказе безопасности. Я также голосую за возврат 200 в ситуации, когда у вас есть некоторые данные, и в целом вам разрешен доступ к таблице, но нет доступа ко всем данным, которые соответствуют вашему запросу (данные были отфильтрованы из-за безопасности на уровне объекта, но в целом вам разрешено запрос).