Що є найбільш відповідним кодом статусу HTTP для сторінки помилок "елемент не знайдено"


117

Мені цікаво, який найбільш відповідний код статусу HTTP для сторінки "елемент не існує".

Якщо сама сторінка не існує, я, очевидно, буду використовувати 404. Однак на одній із моїх сторінок є useridаргумент (це сторінка "редагувати користувача"), і якщо немає жодного користувача з вказаним ідентифікатором користувача, я показую сторінки помилок, але я також хотів би надіслати заголовок статусу 4xx (оскільки "200 ОК" насправді не підходить).

Я думаю, що 404 було б нормально, оскільки це "не знайдено" і не "файл не знайдено", але мені цікаво, чи є кращий код для цього випадку.

Відповіді:


139

Бути занадто розумним із незрозумілими кодами помилок HTTP - це погана ідея. Браузери іноді реагують недобросовісними способами, що пригнічують ситуацію. Дотримуйтесь 404.


14
Чорт за те, що ви дали добру пораду :( OCD до не 404, все це реально.
Керрі Кендалл

16
404 помилки дещо неоднозначні для розмежування поганого URI від сутності, не знайденої. Новий стандартний код потрібен для розмежування 404.
Breakskater

2
Я віддаю перевагу поверненню 204 порожнього вмісту, ніж поверненню коду статусу
амбіту

46

Код повернення 404 насправді означає "ресурс не знайдено" і застосовується до будь-якої організації, щодо якої було зроблено запит, але його не задоволено. Таким чином, він працює однаково добре для сторінок, підрозділів сторінок і будь-якого елемента, який існує на сторінці, який має конкретний запит, який потрібно надати.

Отже, 404 - це правильний код, який слід використовувати у цьому сценарії. Зауважте, що він не застосовується до "сервера не знайдено", що є різною ситуацією, коли запит був виданий, але не отримав відповіді взагалі, на відміну від відповіді, але без запиту на ресурс.


1
Що робити, якщо я хочу оновити foo-об’єкт з id = 1, і в базі даних немає foo з цим ідентифікатором?
valijon

1
У цьому випадку у вас є проблема з одночасністю виправлення: якщо ви отримали об'єкт з id = 1, і він більше не існує, коли ви намагаєтесь оновити його, якийсь інший потік або процес ігнорував ваш замок (або ви його не встановили) і видалили його. Це не добре. Крім того, якщо ви намагаєтесь оновити об’єкт id = n (там, де вам надано n), не попередньо перевіривши його, ви пропускаєте крок перевірки в логіці оновлення, що також не годиться.
Вісім-бітовий гуру


8

Це залежить від того, чи є userid ідентифікатором ресурсу або додатковим параметром. Якщо це так, це нормально повернути 404, якщо ні, ви можете повернути інший код, наприклад

400 (bad request) ‐ indicates a bad request
або
412 (Precondition Failed) e.g. conflict by performing conditional update

Більше інформації у безкоштовному InfoQ Explores: REST book.


1
Під «додатковим параметром» ви маєте на увазі поле заголовка запиту? В іншому випадку я б не рекомендував використовувати 412. "Код стану 412 (попередня умова не вдався) вказує на те, що при тестуванні на сервері одна або кілька умов, заданих у полях заголовка запиту, оцінені як помилкові."
oferei
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.