Какой код состояния HTTP наиболее подходит для страницы с ошибкой «элемент не найден»

117

Мне любопытно, какой код состояния HTTP наиболее подходит для страницы «элемент не существует».

Если сама страница не существует, я, очевидно, буду использовать 404. Однако у одной из моих страниц есть useridаргумент (это страница «редактирования пользователя»), и в случае, если пользователя с данным идентификатором пользователя не существует, я показываю страницу с ошибкой, но я бы также хотел отправить заголовок статуса 4xx (поскольку "200 OK" на самом деле не подходит).

Думаю, 404 подойдет, так как он «не найден», а не «файл не найден», но мне интересно, есть ли лучший код для этого случая.

ThiefMaster
источник

Ответы:

140

Излишне умничать с неясными кодами ошибок HTTP - плохая идея. Браузеры иногда реагируют бесполезным образом, запутывая ситуацию. Придерживайтесь 404.

bmargulies
источник
14
Будь ты проклят за хороший совет :( ОКР не 404, все вещи реальны.
Кэрри Кендалл
16
Ошибки 404 несколько неоднозначны для различения плохого URI и не найденного объекта. Новый стандартный код необходим для устранения неоднозначности ошибок 404.
Breakskater
2
Я предпочитаю возвращать 204 пустых содержимого, чем возвращать неоднозначный код статуса
hsnslh
46

Код возврата 404 фактически означает «ресурс не найден» и применяется к любому объекту, для которого запрос был сделан, но не удовлетворен. Таким образом, он одинаково хорошо работает для страниц, подразделов страниц и любого элемента, который существует на странице, у которой есть конкретный запрос для отображения.

Итак, 404 - правильный код для использования в этом сценарии. Обратите внимание, что это не относится к «серверу не найден», который представляет собой другую ситуацию, когда запрос был отправлен, но не получил ответа вообще, в отличие от ответа, но без запрошенного ресурса.

Восьмибитный гуру
источник
1
Что, если я хочу обновить объект foo с идентификатором = 1, а в базе данных нет foo с этим идентификатором?
valijon
1
В этом сценарии у вас есть проблема параллелизма, которую нужно исправить: если вы получили объект с id = 1, и он больше не существует, когда вы пытаетесь его обновить, какой-то другой поток или процесс проигнорировали вашу блокировку (или вы ее не установили) и удалил его. Это не хорошо. В качестве альтернативы, если вы пытаетесь обновить объект id = n (где n предоставляется вам) без предварительной проверки его существования, вам не хватает шага проверки в вашей логике обновления, что тоже нехорошо.
Eight-Bit Guru
8

Это зависит от того, является ли идентификатор пользователя идентификатором ресурса или дополнительным параметром. Если это так, то можно вернуть 404, если нет, вы можете вернуть другой код, например

400 (bad request) ‐ indicates a bad request
или
412 (Precondition Failed) e.g. conflict by performing conditional update

Больше информации в бесплатной книге InfoQ Explores: REST .

cetnar
источник
1
Говоря «дополнительный параметр», вы имеете в виду поле заголовка запроса? В противном случае я бы не рекомендовал использовать 412. «Код состояния 412 (Precondition Failed) указывает, что одно или несколько условий, указанных в полях заголовка запроса, оцениваются как ложные при проверке на сервере».
oferei
-1

204:

Без содержания." Этот код означает, что сервер успешно обработал запрос, но не собирается возвращать какой-либо контент.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204

Рикардо Геллман
источник
«Элемент не найден» обычно не приводит к успеху, поэтому я не думаю, что код состояния 2xx уместен.
ThiefMaster