Наприклад, ви запускаєте GET-запит, users/9
але немає користувача з ідентифікатором №9. Який найкращий код відповіді?
- 200 ОК
- 202 Прийнято
- 204 Немає вмісту
- 400 Поганий запит
- 404 Не знайдено
Наприклад, ви запускаєте GET-запит, users/9
але немає користувача з ідентифікатором №9. Який найкращий код відповіді?
Відповіді:
TL; DR: Використання 404
Дивіться цей блог . Це дуже добре пояснює.
Короткий зміст коментарів блогу щодо 204
:
204 No Content
не дуже корисно як код відповіді для веб-переглядача (хоча, згідно з специфікаціями HTTP, браузерам потрібно розуміти це як код відповіді "не змінювати погляд").204 No Content
це , однак, дуже корисно для AJAX веб - сервісів , які можуть хотіти , щоб вказати успіх без необхідності щось то повернути. (Особливо в таких випадках , як DELETE
і POST
з , які не вимагають зворотного зв'язку).Отже, відповідь на ваше запитання - це використання 404
у вашому випадку. 204
це спеціалізований код відгуку, який не слід часто повертати до браузера у відповідь на GET
.
Інші коди відповідей, які ще менш підходящі , ніж 204
та 404
:
200
слід повернути разом з тілом все, що ви успішно дістали. Недоцільно, коли сутність, яку ви отримуєте, не існує.202
використовується, коли сервер розпочав роботу над об'єктом, але об'єкт ще не повністю готовий. Звичайно, це не так. Ви не розпочали і не почнете конструювання користувача 9 у відповідь на GET
запит. Це порушує всілякі правила.400
використовується у відповідь на погано відформатований запит HTTP (наприклад, неправильно сформовані заголовки http, неправильно упорядковані сегменти тощо). З цим майже напевно впорається будь-яка рамка, яку ви використовуєте. Вам не доведеться з цим боротися, якщо ви не пишете власний сервер з нуля. Редагувати : новіші RFC тепер дозволяють використовувати 400 для семантично недійсних запитів.Опис Вікіпедії щодо кодів статусу HTTP особливо корисний. Ви також можете побачити визначення в документі HTTP / 1.1 RFC2616 на веб-сайті www.w3.org
204
коду відповіді (Без вмісту).
/badurl
або /user/9
коли такого користувача не існує. Розробник може допомогти, додавши кращу причину фрази, ніж "Не знайдено", але цього не потрібно.
The server has not found anything matching the Request-URI
. Насправді сервер веб-додатків знайшов дію, що відповідає запиту URI, хоча сервер db цього не зробив. Однак він також говорить This status code is commonly used when [...] no other response is applicable
, тому я думаю, що це дещо підтверджує його використання (навіть якщо я не згоден з / подобається).
Я категорично проти 404 на користь 204 або 200 із порожніми даними. Або хоча б слід використовувати об'єкт відповіді з 404.
Запит був отриманий та оброблений належним чином - він запустив код програми на сервері, тому реально не можна сказати, що це клієнтська помилка, і тому весь клас кодів помилок клієнта (4xx) не відповідає.
Що ще важливіше, 404 може статися з ряду технічних причин. Наприклад, програма тимчасово деактивована або видалена на сервері, проблеми з підключенням проксі та інше. Тому клієнт не може розрізняти 404, що означає "порожній набір результатів", і 404, що означає "службу неможливо знайти, спробуйте пізніше".
Це може бути фатальним: Уявіть собі бухгалтерську службу у вашій компанії, яка перераховує всіх працівників, яким виплачується щорічна премія. На жаль, щоразу, коли він називається, він повертає 404. Чи означає це, що ніхто не повинен платити за бонус, або що додаток наразі не працює для нового розгортання?
-> Для прикладних програм, які піклуються про якість своїх даних, 404 без об'єкта відповідей, таким чином, майже не займається.
Крім того, багато клієнтських систем відповідають на 404, кидаючи виняток, не задаючи більше запитань. Це змушує розробника клієнта зловити цей виняток, оцінити його, а потім вирішити, виходячи з цього, чи слід фіксувати його як помилку, яку вибирає, наприклад, компонент моніторингу, чи слід ігнорувати його. Мені це теж не здається гарним.
Перевага 404 перед 204 полягає в тому, що він може повернути об'єкт відповіді, який може містити певну інформацію про те, чому запитуваний ресурс не знайдено. Але якщо це дійсно актуально, то можна також розглянути можливість використання відповіді 200 ОК та спроектувати систему таким чином, що дозволяє реагувати на помилки у даних корисного навантаження. Крім того, можна використовувати корисне навантаження відповіді 404 для повернення структурованої інформації абоненту. Якщо він отримує, наприклад, сторінку html замість XML або JSON, що він може розібратися, то це хороший показник того, що щось технічне пішло не так замість відповіді "без результату", що може бути дійсним з точки зору абонента. Або можна використовувати для цього заголовок відповіді HTTP.
Все-таки я вважаю за краще 204 або 200 з порожньою відповіддю, хоча. Таким чином статус технічного виконання запиту відокремлюється від логічного результату запиту. 2xx означає "технічне виконання нормально, це результат, вирішуйте це".
Я думаю, що в більшості випадків клієнт повинен залишати рішення про те, допустимий чи ні порожній результат. Повертаючи 404 без відповіді, незважаючи на правильне технічне виконання, клієнт може вирішити вважати випадки помилками, які просто не мають помилок.
Ще одна швидка аналогія: Повернення 404 для "не знайдено результату" - це як викидання DatabaseConnectionException, якщо запит SQL не повернув результатів. Це може виконати роботу, але існує маса можливих технічних причин, які викидають той самий виняток, який потім був би помилково прийнятий за дійсний результат.
503 Service Unavailable
.
/users
маршрут, але /users/9
, наприклад, "Користувач, відомий як # 9"), тому порівняння "порожнього набору результатів" не має сенсу. 404 означає, що об'єкт не існує.
Спочатку я думав, що 204 має сенс, але після обговорень я вважаю, що 404 є єдиною вірною правильною відповіддю. Розглянемо наступні дані:
Користувачі: Джон, Пітер
METHOD URL STATUS RESPONSE
GET /users 200 [John, Peter]
GET /users/john 200 John
GET /users/kyle 404 Not found
GET /users?name=kyle` 200 []
DELETE /users/john 204 No Content
Деякі відомості:
пошук повертає масив, у нього просто не було збігів, але він містить вміст: порожній масив .
404, звичайно, найвідоміший за URL-адресами, які не підтримуються запитуваним сервером, але відсутній ресурс насправді той самий.
Незважаючи на те, /users/:name
зіставляється з users/kyle
, користувач Кайл не доступний ресурс тому 404 все ще застосовується. Це не пошуковий запит, це пряма посилання динамічним URL-адресом , тому 404 це.
У всякому разі, мої два центи :)
Якщо очікується, що ресурс існує, але він може бути порожнім, я б стверджував, що може бути простіше просто отримати 200 ОК з поданням, яке вказує на те, що річ порожня.
Тож я вважаю за краще / речі повертають 200 ОК із {"items": []}, ніж 204 без нічого, тому що таким чином колекція з 0 предметами може трактуватися так само, як колекція з одним або більше предмета в ньому.
Я просто лишаю 204 Без вмісту для PUT та DELETE, де, можливо, справді немає корисного представлення.
У випадку, якщо / thing / 9 насправді не існує, 404 підходить.
customers/1/addressbook
, RPC спосіб полягає в тому, щоб викликати кінцеву точку на зразок GetCustomerAddressBook
і отримувати дані або по суті нульові, і не потрібно так сильно турбуватися про складності HTTP. У обох є плюси і мінуси.
Згідно з публікацією w3 ,
200 ОК
Запит вдався. Інформація, що повертається з відповіддю, залежить від методу, який використовується у запиті
202 Прийнято
Запит прийнято для обробки, але обробка не завершена.
204 Немає вмісту
Сервер виконав цей запит, але йому не потрібно повертати сутність, і може захотіти повернути оновлену інформацію.
400 Поганий запит
Сервер не міг зрозуміти запит через неправильний синтаксис. Клієнт НЕ повинен повторювати запит без змін
401 Несанкціонований
У запиті потрібна автентифікація користувача. Відповідь ОБОВ'ЯЗКОВО включає поле заголовка WWW-Authenticate
404 Не знайдено
Сервер не знайшов нічого, що відповідає Request-URI. Не вказується, чи є стан тимчасовим чи постійним
204 No Content
коли не знайде результатів. Ні 404
, це результат для вас, але він не має змісту ..
Щоб узагальнити або спростити,
2xx: Необов'язкові дані: Добре сформований URI: Критерії не є частиною URI: Якщо критерії необов’язкові, які можна вказати в @RequestBody та @RequestParam, це повинно призвести до 2xx. Приклад: фільтр за назвою / статусом
4xx: Очікувані дані: Недостатньо сформований URI: Критерії є частиною URI: Якщо критерії є обов'язковими, їх можна вказати лише в @PathVariable, то це повинно призвести до 4xx. Приклад: пошук за унікальним ідентифікатором.
Таким чином, для запитуваної ситуації: "користувачів / 9" буде 4xx (можливо, 404) Але для "користувачів? Ім'я = супермен" має бути 2xx (можливо, 204)
Поставлено два запитання. Один у назві та один у прикладі. Я думаю, що це частково призвело до суперечки щодо того, яка відповідь є підходящою.
Назва запитання задає порожні дані. Порожні дані все ще є даними, але не є такими ж, як відсутні дані. Отже, це пропонує запитувати набір результатів, тобто список, можливо, від /users
. Якщо список порожній, він все ще залишається, тому 204 (Без вмісту) є найбільш підходящим. Ви тільки що попросили список користувачів і його отримали, він просто не має вмісту.
Наведений приклад запитує про конкретний об'єкт, користувача /users/9
,. Якщо користувача №9 не знайдено, жоден об’єкт користувача не повертається. Ви запитували певний ресурс (об’єкт користувача) і не давали йому, оскільки його не було знайдено, тому 404 є відповідним.
Я думаю, що спосіб вирішити це, якщо ви можете використовувати відповідь так, як ви очікували, не додаючи жодного умовного твердження, тоді використовуйте 204, інакше використовуйте 404.
У моїх прикладах я можу переглядати порожній список, не перевіряючи, чи є у нього вміст, але я не можу відображати дані об’єкта користувача на об’єкті, що не має значення, нічого не порушуючи або додаючи чек, щоб побачити, чи він є нульовим.
Звичайно, ви можете повернути об'єкт, використовуючи нульовий шаблон об'єкта, якщо це відповідає вашим потребам, але це обговорення для іншого потоку.
Оглянувши питання, ви не повинні використовувати 404
чому?
На основі RFC 7231 правильний код статусу204
У пришельниках вище я помітив 1 невелике непорозуміння:
1.- ресурс: /users
2.- /users/8
це не ресурс, це: ресурс /users
з параметром маршруту 8
, споживач, можливо, не може його помітити і не знає різниці, але видавець це і повинен знати! ... тому він повинен повернути точну відповідь для споживачів. періоду.
тому:
На основі RFC: 404 невірно, оскільки /users
знайдені ресурси , але логіка, виконана за допомогою параметра 8
, не знайшла жодного content
повернення як відповідь, тому правильна відповідь:204
Тут головне: 404
навіть не знайдено ресурсу для обробки внутрішньої логіки
204
є: Я знайшов ресурс, була виконана логіка, але я не знайшов жодних даних, використовуючи ваші критерії, наведені в параметрі маршруту, тому я не можу повернути вам що-небудь. Вибачте, підтвердьте свої критерії та зателефонуйте мені ще раз.
200
: нормально, я знайшов ресурс, логіка була виконана (навіть коли я нічого не змушений повертати), взяти це і використовувати його за своїм бажанням.
205
: (найкращий варіант відповіді GET) Я знайшов ресурс, виконувалась логіка, у мене є для вас якийсь вміст, добре використовуйте його, о, до речі, якщо ви збираєтеся поділитися цим у поданні, будь ласка, оновіть перегляд на відобразити його.
Сподіваюся, це допомагає.
Що в існуючих відповідях не роз'яснюється, це те, що це має значення, якщо ви використовуєте параметри шляху або параметри запиту.
/users/9
відповіді має бути, 404
оскільки цей ресурс не знайдено. /users/9
- це ресурс, а результат - одинаковий, або помилка, його не існує. Це не монада./users?id=9
, відповідь повинна бути, 204
оскільки ресурс /users
був знайдений, але він не міг повернути жодних даних. Ресурс /users
існує і результат n-ary, він існує, навіть якщо він порожній. Якщо id
унікальний, це є монадой.Використовувати параметри шляху або параметри запиту, залежить від випадку використання. Я віддаю перевагу параметрам шляху для обов'язкових, нормативних або ідентифікаційних аргументів та параметрів запиту для необов'язкових, ненормативних або присвоюючих аргументів (наприклад, підказка, локалізація зіставлення та інше). У API REST я використовував би /users/9
не /users?id=9
особливо через можливе введення, щоб отримати "дочірні записи", як, наприклад, /users/9/ssh-keys/0
отримати перший відкритий ключ ssh або /users/9/address/2
отримати третю поштову адресу.
Я вважаю за краще використовувати 404. Ось чому:
204
це як void
метод. Я б не використати його для GET
, тільки POST
, PUT
і DELETE
. Я роблю виняток у випадку, GET
коли ідентифікатори - це параметри запиту, а не параметри шляху.NoSuchElementException
, ArrayIndexOutOfBoundsException
або що - щось подібне, викликане клієнтом, ідентифікатор , який не існує, тому, це помилка клієнта.204
означає додаткову гілку в коді, якої можна було б уникнути. Це ускладнює клієнтський код, а в деяких випадках також ускладнює код сервера (залежно від того, чи використовуєте ви сутність / модель монади чи звичайні сутності / моделі; і я настійно рекомендую триматися подалі від монад суті / моделі, це може призвести до неприємних помилок де монади ви вважаєте, що операція успішна, і поверніть 200 або 204, коли ви насправді повинні повернути щось інше).І останнє, але не менш важливе: послідовність
GET /users/9
PUT /users/9
і DELETE /users/9
PUT /users/9
і DELETE /users/9
вже доведеться повернутись 204
у разі успішного оновлення чи видалення. То що їм повернути, якщо користувач 9 не існував? Немає сенсу мати ту саму ситуацію, що і різні коди статусу залежно від використовуваного методу HTTP.
Крім того, не нормативна, а культурна причина: Якщо 204
використовуватись для GET /users/9
наступного, що відбудеться в проекті, це те, що хтось вважає, що повернення 204
добре для російських методів. І це ускладнює клієнтський код, оскільки замість того, щоб просто перевірити, 2xx
а потім розшифрувати тіло, клієнт тепер повинен спеціально перевірити, 204
і в цьому випадку пропустити розшифровку тіла. Буд, що замість цього робить клієнт? Створити порожній масив? Чому б цього не було на дроті? Якщо клієнт створює порожній масив, 204 - це форма тупого стиснення. Якщо клієнт використовує null
натомість, відкриється зовсім інша банка глистів.
Twitter використовує 404 зі спеціальним повідомленням про помилку на кшталт "Не знайдено даних".
Посилання: https://developer.twitter.com/en/docs/basics/response-codes.html
204 є більш доречним. Особливо, коли у вас є система оповіщення, щоб забезпечити безпеку веб-сайту, 404 в цьому випадку спричинить плутанину, оскільки ви не знаєте, що деякі сповіщення 404 - це помилки утиліти або звичайні запити, але відповідь порожня.
Я б сказав, жоден із насправді не підходить. Як було сказано - наприклад, від @anneb, я також вважаю, що частина проблем виникає в результаті використання коду відповіді HTTP для транспортування статусу, що стосується послуги RESTful. Все, що може сказати службі REST про власну обробку, слід транспортувати за допомогою спеціальних кодів REST.
Я б стверджував, що якщо сервер HTTP знайде будь-яку службу, яка готова відповісти на запит, на який він був надісланий, він не повинен відповідати HTTP 404 - врешті-решт, щось було знайдено сервером - якщо це прямо не сказано сервіс, який обробляє запит.
Давайте на хвилину припустимо наступний URL: http://example.com/service/return/test
.
404
правильно. Те саме відбувається, якщо він просить якусь службу доставити саме цей файл, і ця служба каже йому, що нічого з цього імені не існує.Без будь-якої відповіді служби, яка явно вимагає іншої поведінки, сервер HTTP може сказати лише 3 речі:
503
якщо служба, яка повинна обробляти запит, не працює або не відповідає;200
в іншому випадку, оскільки сервер HTTP може фактично задовольнити запит - незалежно від того, що служба скаже пізніше;400
або 404
вказувати на відсутність такої послуги (на відміну від "існує, але офлайн") і нічого іншого не знайдено.Щоб повернутися до питання: я думаю, що найчистішим підходом було б не використовувати HTTP будь-який код відповіді, окрім сказаного раніше. Якщо служба присутня та відповідає, код HTTP повинен бути 200. Відповідь має містити статус, який служба повертає в окремому заголовку - тут служба може сказати
REST:EMPTY
наприклад, якщо його просили шукати що-небудь. і це дослідження повернулося порожнім;REST:NOT FOUND
якщо його просили спеціально для чого-небудь. "Ідентифікатор, подібний до ідентифікації" - це ім'я файлу або ресурсу за ідентифікаційним номером або записом № 24 тощо. - і конкретний ресурс не знайдений (як правило, один конкретний ресурс запитувався і не був знайдений);REST:INVALID
якщо будь-яка частина запиту, який він надіслала, служба не визнає.(зауважте, що я заздалегідь встановив їх за допомогою "REST:", щоб позначити той факт, що, хоча вони можуть мати ті ж значення або формулювання, що і коди відповідей HTTP, вони є що-небудь зовсім інше)
Повернемося до вищезгаданої URL-адреси та перевіримо випадок B, коли служба вказує HTTP-серверу, що він сам не обробляє цей запит, а передає його на SERVICE
. HTTP обслуговує лише те, що йому передано SERVICE
, він нічого не знає про return/test
частину, якою обробляється SERVICE
. Якщо ця послуга запущена, HTTP повинен повернутися, 200
оскільки він дійсно знайшов щось для обробки запиту.
Статус, який повертається SERVICE
(і який, як було сказано вище, хотілося б бачити в окремому заголовку), залежить від того, яку дію очікують насправді:
return/test
запитує конкретний ресурс: якщо він існує, поверніть його зі статусом REST:FOUND
; якщо цього ресурсу не існує, поверніться REST:NOT FOUND
; це може бути продовжено до повернення, REST:GONE
якщо ми знаємо, що воно колись існувало і не повернеться, і REST:MOVED
якщо ми знаємо, що воно пішло в голлівудreturn/test
вважається пошуковою чи фільтрованою операцією: якщо набір результатів порожній, поверніть порожній набір у запитуваному типі та статусі REST:EMPTY
; набір результатів у запитуваному типі та статусіREST:SUCCESS
return/test
це не операція, яку розпізнає SERVICE
: поверніть, REST:ERROR
якщо вона абсолютно неправильна (наприклад, помилка друку retrun/test
), або REST:NOT IMPLEMENTED
якщо вона планується на потім.Ця відмінність набагато чистіше, ніж змішування двох різних речей. Це також полегшить налагодження та обробку лише трохи складнішою, якщо вона взагалі є.
Проблема та обговорення виникає з того, що коди відповідей HTTP використовуються для позначення стану служби, результати якої обслуговуються HTTP, або для позначення sth. це не входить до сфери дії самого HTTP-сервера. Через цю невідповідність на питання не можна відповісти, і всі думки піддаються великій дискусії.
Стан запиту, обробленого службою, а не HTTP-сервером, дійсно НЕ повинен (RFC 6919) надаватися кодом відповіді HTTP. Код HTTP ПОТРІБНО (RFC 2119) містить лише інформацію, яку сервер HTTP може надати з власної сфери: а саме, чи було виявлено, що служба обробляє запит чи ні.
Натомість слід використовувати інший спосіб повідомляти споживача про стан запиту до служби, яка фактично обробляє запит. Моя пропозиція - зробити це через певний заголовок. В ідеалі, як назва заголовка, так і його зміст відповідають стандарту, який спрощує роботу споживачів з тезами.
Відповідно до RFC7231 - page59 ( https://tools.ietf.org/html/rfc7231#page-59 ) визначення 404 відповіді коду статусу:
6.5.4. 404 Не знайдено Код стану 404 (Не знайдено) вказує на те, що сервер-джерело не знайшов поточне представлення для цільового ресурсу або не бажає розкривати, що існує. Код статусу 404 не вказує, чи є ця відсутність представництва тимчасовою чи постійною; переважний код статусу 410 (пропав) понад 404, якщо сервер-джерело знає, імовірно, через деякі настроювані засоби, що умова, ймовірно, буде постійною. Відповідь 404 кешована за замовчуванням; тобто, якщо інше не визначено визначенням методу або явними кеш-керами (див. Розділ 4.2.2 [RFC7234]).
І головне, що викликає сумніви, - це визначення ресурсу в наведеному вище контексті. Відповідно до того ж RFC (7231), визначення ресурсу:
Ресурси: ціль запиту HTTP називається "ресурс". HTTP не обмежує характер ресурсу; він просто визначає інтерфейс, який може використовуватися для взаємодії з ресурсами. Кожен ресурс ідентифікується за допомогою Уніфікованого ідентифікатора ресурсу (URI), як описано в розділі 2.7 [RFC7230]. Коли клієнт створює повідомлення запиту HTTP / 1.1, він надсилає цільовий URI в одній з різних форм, як визначено в (Розділ 5.3 [RFC7230]). Коли запит отримано, сервер реконструює ефективний URI запиту для цільового ресурсу (Розділ 5.5 [RFC7230]). Однією з цілей проекту HTTP є відокремлення ідентифікації ресурсів від семантики запиту, що стає можливим шляхом вивірки семантики запиту в методі запиту (Розділ 4) та декількох полів заголовків, що змінюють запит (Розділ 5).
Отже, на мій погляд, код статусу 404 не повинен використовуватися для успішного запиту GET з порожнім результатом (приклад: список без результату для конкретного фільтра)
Такі речі можуть бути суб’єктивними, і є цікаві та різноманітні тверді аргументи з обох сторін. Однак [на мою думку] повернення 404 за відсутніми даними є невірним . Ось спрощений опис, щоб зробити це зрозумілим:
Нічого не зламалось, кінцева точка була знайдена, і таблицю та стовпці знайдено, тому БД запитувала, а дані "успішно" поверталися!
Тепер - чи має ця «успішна відповідь» дані чи не має значення, ви попросили відповідь «потенційних» даних і ця відповідь із «потенційними» даними була виконана. Недійсні, порожні тощо є дійсними даними.
200 означає, що будь-який запит, який ми зробили, був успішним. Я запитую дані, нічого не пішло з HTTP / REST, і коли дані (хоч і порожні) повернуті, мій "запит на дані" був успішним.
Поверніть 200 і нехай запитувач обробляє порожні дані, оскільки цього вимагає кожен конкретний сценарій!
Розглянемо цей приклад:
Ці порожні дані цілком дійсні. Це означає, що у користувача немає порушень. Це 200, оскільки це все справедливо, як тоді я можу зробити:
У вас немає порушень, майте чорничний кекс!
Якщо ви вважаєте це 404, що ви заявляєте? Не вдалося знайти порушення користувача? Тепер граматично це правильно, але це просто неправильно в світі REST, якщо успіх чи невдача стосується запиту. Дані про "порушення" для цього користувача можна було знайти успішно. Є нульові порушення - реальне число, що представляє дійсний стан.
[Весела примітка ..]
У своєму заголовку ви підсвідомо погоджуєтесь, що 200 - це правильна відповідь:
Який правильний код відповіді REST для дійсного запиту, але порожніх даних?
Ось кілька моментів, які слід враховувати при виборі коду статусу, незалежно від суб'єктивності та хитромудрого вибору:
Кодуйте вміст відповіді загальною перерахунком, яка дозволяє клієнтові вмикати його і відповідно розкладати логіку. Я не впевнений, як ваш клієнт розрізнив би різницю між "даними не знайдено" 404 та "веб-ресурсом не знайдено" 404? Ви не хочете, щоб хтось переглядав користувача Z / 9, і клієнт відмовлявся, ніби запит був дійсним, але даних не повернуто.
Чому б не використовувати 410? Це передбачає, що запитуваний ресурс більше не існує, і очікується, що клієнт ніколи не зробить запит на цей ресурс у вашому випадку users/9
.
Більш детальну інформацію про 410 можна знайти тут: https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
Сумно, що щось таке просте і чітко визначене стало "думкою, заснованою на цій думці".
Сервер HTTP знає лише "сутність", яка є абстракцією для будь-якого контенту, будь то статична веб-сторінка, список результатів пошуку, список інших об'єктів, опис json чогось, медіа-файл тощо тощо.
Очікується, що кожне таке об'єкт буде ідентифіковано за унікальною URL-адресою, наприклад
Якщо сервер знайде ресурс за вказаною URL-адресою, не має значення, який його вміст - 2G даних, null, {}, [] - доки він існує, це буде 200. Але якщо така сутність є не відома серверу, очікується повернути 404 "Не знайдено".
Здається, одна плутанина пов'язана з розробниками, які думають, що якщо програма має обробник певної форми контуру, це не повинно бути помилкою. В очах протоколу HTTP не має значення, що сталося з внутрішніми серверами (тобто, відповів маршрутизатор за замовчуванням або обробник для певної форми шляху), доки на сервері немає відповідного об'єкта на сервері запитувана URL-адреса (що вимагає MP3-файл, веб-сторінку, об’єкт користувача тощо), яка повертає дійсний вміст (порожній або іншим способом), він повинен бути 404 (або 410 тощо).
Інший момент плутанини, здається, навколо "немає даних" і "немає сутності". Перший - про зміст суб'єкта господарювання, а другий - про його існування.
Приклад 1:
Приклад 2:
Приклад 3:
404 буде дуже заплутаним для будь-якого клієнта, якщо ви повернетесь лише тому, що даних у відповідь немає.
Для мене Код реакції 200 з порожнім корпусом достатньо, щоб зрозуміти, що все ідеально, але немає даних, що відповідають вимогам.
За даними Microsoft: типи повернення дій контролера у веб-API ASP.NET Core , прокрутіть майже донизу, ви знайдете наступне розмиття приблизно 404, що стосується об'єкта, не знайденого в базі даних. Тут вони припускають, що 404 підходить для порожніх даних.
Як зазначають багато хто, 404 вводить в оману, і це не дозволяє клієнту проводити дискримінацію, якщо uri запиту не існує або якщо запитуваний uri не може отримати запитуваний ресурс.
Очікується, що стан 200 міститиме дані про ресурси - тож це не правильний вибір. Статус 204 повністю означає щось інше і не повинен використовуватися як відповідь на GET-запити.
Усі інші існуючі статуси з тієї чи іншої причини не застосовуються.
Я бачив, як цю тему обговорювали знову і знову в багатьох місцях. Для мене болісно очевидно, що для усунення плутанини навколо теми потрібен спеціальний статус успіху. Щось на кшталт " 209 - немає ресурсу для відображення".
Це буде статус 2xx, оскільки не знайти ідентифікатор не слід вважати клієнтською помилкою (якби клієнти знали все, що є в БД сервера, їм би не потрібно було нічого запитувати на сервер, чи не так?). Цей спеціальний статус стосуватиметься всіх питань, які обговорювались із використанням інших статусів.
Питання лише в тому, як змусити RFC прийняти це як стандарт?