¿Cuál es el código de estado HTTP más apropiado para una página de error de "artículo no encontrado"?

117

Tengo curiosidad por saber cuál es el código de estado HTTP más apropiado para una página de "artículo no existe".

Si la página en sí no existe, obviamente usaré 404. Sin embargo, una de mis páginas tiene un useridargumento (es una página de "editar usuario") y en caso de que no exista ningún usuario con el ID de usuario dado, estoy mostrando un página de error, pero también me gustaría enviar un encabezado de estado 4xx (ya que "200 OK" realmente no encaja).

Supongo que 404 estaría bien ya que "no se encuentra" y no "archivo no encontrado", pero me pregunto si hay un código mejor para este caso.

ThiefMaster
fuente

Respuestas:

139

Ser demasiado inteligente con los códigos de error HTTP más oscuros es una mala idea. Los navegadores a veces reaccionan de manera inútil que confunden la situación. Quédate con 404.

bmargulies
fuente
14
Maldito seas por dar buenos consejos :( Sin embargo, el TOC de no 404 todas las cosas es real.
Carrie Kendall
16
Los errores 404 son algo ambiguos para diferenciar un URI incorrecto de una entidad no encontrada. Se necesita un nuevo código estándar para eliminar la ambigüedad de los 404.
Breakskater
2
Prefiero devolver 204 contenido vacío que devolver un código de estado
ambigus
46

Un código de retorno 404 en realidad significa 'recurso no encontrado' y se aplica a cualquier entidad para la cual se realizó una solicitud pero no se satisfizo. Por lo tanto, funciona igualmente bien para páginas, subsecciones de páginas y cualquier elemento que exista en la página que tenga una solicitud específica para ser renderizado.

Entonces, 404 es el código correcto para usar en este escenario. Tenga en cuenta que no se aplica a "servidor no encontrado", que es una situación diferente en la que se emitió una solicitud pero no se respondió en absoluto, a diferencia de la respuesta pero sin el recurso solicitado.

Gurú de ocho bits
fuente
1
¿Qué pasa si quiero actualizar el objeto foo con id = 1 y no hay foo en la base de datos con este id?
Valijon
1
En este escenario, tiene un problema de concurrencia que solucionar: si recuperó un objeto con id = 1 y ya no existe cuando intenta actualizarlo, algún otro hilo o proceso ignoró su bloqueo (o no configuró uno) y lo borró. Eso no es bueno. Alternativamente, si está intentando actualizar object id = n (donde se le proporciona n) sin verificar primero que existe, le falta un paso de validación en su lógica de actualización, lo cual tampoco es bueno.
Gurú de ocho bits
8

Eso depende de si el ID de usuario es un identificador de recurso o un parámetro adicional. Si es así, está bien devolver 404; de lo contrario, puede devolver otro código como

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

Más información en el libro gratuito InfoQ Explores: REST .

cetnar
fuente
1
Al decir "parámetro adicional", ¿te refieres al campo de encabezado de solicitud? De lo contrario, no recomendaría usar 412. "El código de estado 412 (Precondición fallida) indica que una o más condiciones dadas en los campos del encabezado de la solicitud se evaluaron como falsas cuando se probaron en el servidor".
oferei