Правильна відповідь REST для порожнього столу?


106

Скажімо, ви хочете отримати список користувачів, зателефонувавши GETдо них api/users, але наразі таблиця була врізана, тому користувачів немає. Яка відповідна відповідь для цього сценарію: 404чи 204?


19
Я відповів би 200 та порожньою колекцією (не порожній корпус відповідей, а скоріше колекція без елементів всередині; це буде виглядати по-різному залежно від поверненого формату)
toniedzwiedz

4
404 в цьому контексті, ймовірно, краще підходить для "таблиці не знайдено". Я б сказав повернути порожній список.
мата


2
@EJoshuaS Це не так. Обидва питання мої і дуже старі. Вони схожі, але не дублікати.
ІМБ

1
@EJoshuaS Вони, очевидно, не дублікати. Це питання про те, /api/usersпоки йдеться про це /api/users/1.
Франклін Ю

Відповіді:


230

Я б сказав, жодне.

Чому б не 404 (не знайдено)?

Код стану 404 повинен бути зарезервований для ситуацій, коли ресурс не знайдений. У цьому випадку ваш ресурс - це сукупність користувачів . Ця колекція існує, але наразі вона порожня. Особисто я був би дуже заплутаний як автор клієнта вашої заявки, якщо я отримав 200один і 404наступний день лише тому, що хтось видав пару користувачів. Що я повинен робити? Моя URL-адреса неправильна? Хтось змінив API та знехтував залишити переадресацію.

Чому б не 204 (Без вмісту)?

Ось уривок з опису коду статусу 204 від w3c

Сервер виконав цей запит, але йому не потрібно повертати тіло об'єкта і, можливо, захоче повернути оновлену інформацію.

Хоча це може здатися розумним у цьому випадку, я думаю, що це також збентежить клієнтів. A 204повинен означати, що деяка операція виконана успішно, і дані не потрібно повертати. Це ідеально, як відповідь на DELETEзапит або, можливо, запуск якогось сценарію, для якого не потрібно повертати дані. У випадку api/users, як правило, ви розраховуєте отримати представництво своєї колекції користувачів. Надіслати орган відповіді один раз, а інший раз не надіслати його, є непослідовним та потенційно оманливим.

Чому я використовую 200 (ОК)

З причин, зазначених вище (послідовність), я б повернув представлення порожньої колекції. Припустимо, ви використовуєте XML. Нормальний орган реагування на непусту колекцію користувачів може виглядати так:

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

і якщо список порожній, ви можете просто відповісти чимось подібним (поки все ще використовуєте a 200):

<users/>

Так чи інакше, клієнт отримує орган відповіді, який дотримується певного, добре відомого формату. Немає зайвої плутанини та перевірки коду статусу. Також не порушується визначення коду статусу. Усі щасливі.

Ви можете зробити те ж саме з JSON або HTML або будь-яким іншим форматом.


4
Однозначно згоден. І для відпочинку, я б просто відправити код статусу 200 з порожнім масивом: [].
Чад Джонсон

Має сенс. Не потрібно робити це складніше. 404 буде бентежно.
Вітольд Качурба

Давайте припустимо API, який описує монети в кишені, з кінцевими точками: GET /singleCoin- повертає випадкову одиночну монету з кишені, GET /severalCoins- повертає кілька монет з кишені, які ви можете забрати за один раз. Скажімо, у вас зараз немає монет у кишені. Коли ви запитаєте, GET /singleCoinви отримаєте 404 Not Found, але коли ви запитаєте, GET /severalCoinsви отримаєте 200 OKпорожній список []. Один факт - у вас немає монет, описаних різними відповідями, чому? Я б сказав, що краще завжди діставати 404 Not Found, бо в кишені немає монет.
sempasha

1
@sempasha Це залежить від того, що ти маєш на увазі GET /severalCoins. Якщо ви мандат, який GET /severalCoins повинен повернути кілька монет, це не повинно бути 200, тому що це не нормально; сервер не зміг надати того, що хоче клієнт. Для /singleCoinцього, очевидно , тому що клієнт не хоче рівно одну монету, що не більше, не менше. Це те саме для /coins/7. На відміну від /coinsкінцевої точки, клієнти зазвичай не очікують жодної монети, однієї або декількох монет. Усі вони є дійсною відповіддю. Якщо немає монети, то це те, чого вони хочуть. Це як екслі List<Coin>на Java, а не null.
Франклін Ю

15

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

404 Не знайдено)

Ця відповідь досить правильна, якщо у вас немає таблиці. Не просто порожній стіл, але НЕ ТАКОЖИ КОРИСТУВАЧА. Це підтверджує точну думку - ресурсу немає. Подальші варіанти - надати детальнішу інформацію. ЧОМУ ваша таблиця відсутня, є кілька більш детальних кодів, але 404 досить добре посилатися на ситуацію, коли у вас справді немає таблиці.

200 (ОК)

Усі випадки, коли у вас таблиця, але вона порожня або ваш запитуючий процесор відфільтрував усі результати. Це означає, що "ваш запит правильний, все в порядку, але ви не відповідаєте жодним даним, тому що або ми не маємо даних, або ми не маємо даних, які відповідають вашому запиту. Це має відрізнятися від відповіді на заборону безпеки. Я також голосую за повернення 200 у випадку, коли у вас є деякі дані, і взагалі ви маєте доступ до таблиці, але у вас немає доступу до всіх даних, які відповідають вашому запиту (дані були відфільтровані через захист рівня об'єкта, але взагалі вам дозволяється запит).


10

Якщо ви очікуєте переліку об’єктів користувача, найкращим рішенням буде повернення порожнього списку ([]) з 200 ОК, ніж використання відповіді 404 або 204.


2

однозначно повертає 200.

404 означає, що ресурс не знайдено. Але ресурс існує. А також, якщо відповідь має статус 404. Як ви можете знати, що список користувачів порожній або заповнений?


  • '/ users', якщо порожній, повинен повернути "200".
  • '/ users / 1', якщо ідентифікатор не знайдено. має повернути 404.

2

Потрібно 200 ОК з порожнім списком.

Чому: порожня таблиця означає, що таблиця існує, але не має жодної записи.

404 Не знайдено, запитувана кінцева точка не існує.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.