Qual é o código de status HTTP mais apropriado para uma página de erro “item não encontrado”


117

Estou curioso para saber qual é o código de status HTTP mais apropriado para uma página "o item não existe".

Se a página em si não existir, obviamente usarei 404. No entanto, uma das minhas páginas tem um useridargumento (é uma página de "editar usuário") e, caso não exista nenhum usuário com o ID de usuário fornecido, estou exibindo um página de erro, mas também gostaria de enviar um cabeçalho de status 4xx (já que "200 OK" realmente não se encaixa).

Acho que o 404 estaria ok, já que é "não encontrado" e não "arquivo não encontrado", mas gostaria de saber se há um código melhor para este caso.

Respostas:


139

Ficar muito esperto com códigos de erro HTTP obscuros é uma má ideia. Os navegadores às vezes reagem de maneiras inúteis que ofuscam a situação. Fique com 404.


14
Maldito seja por dar bons conselhos :( O OCD para não 404 todas as coisas é real.
Carrie Kendall

16
Erros 404 são um tanto ambíguos para diferenciar um URI incorreto de uma entidade não encontrada. Um novo código padrão é necessário para eliminar a ambiguidade dos 404s.
Breakskater

2
Eu prefiro retornar 204 conteúdo vazio do que retornar um código de status
ambigus

46

Um código de retorno 404 realmente significa 'recurso não encontrado' e se aplica a qualquer entidade para a qual uma solicitação foi feita, mas não satisfeita. Portanto, funciona igualmente bem para páginas, subseções de páginas e qualquer item que exista na página que tenha uma solicitação específica a ser processada.

Portanto, 404 é o código certo a ser usado neste cenário. Observe que não se aplica a 'servidor não encontrado', que é uma situação diferente em que uma solicitação foi emitida, mas não foi respondida, ao contrário de respondida, mas sem o recurso solicitado.


1
E se eu quiser atualizar o objeto foo com id = 1 e não houver foo no banco de dados com este id?
valijon

1
Neste cenário, você tem um problema de simultaneidade para corrigir: se você recuperou um objeto com id = 1 e ele não existe mais quando você tenta atualizá-lo, algum outro thread ou processo ignorou seu bloqueio (ou você não definiu um) e o excluiu. Isso não é bom. Alternativamente, se você estiver tentando atualizar o id do objeto = n (onde n é fornecido para você) sem primeiro verificar se ele existe, você está perdendo uma etapa de validação em sua lógica de atualização, o que também não é bom.
Eight-Bit Guru de


8

Isso depende se o ID do usuário é um identificador de recurso ou parâmetro adicional. Se for, não há problema em retornar 404; caso contrário, você pode retornar outro código como

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

Mais informações em InfoQ Explores grátis : livro REST .


1
Ao dizer "parâmetro adicional", você quer dizer campo de cabeçalho de solicitação? Caso contrário, eu não recomendaria usar 412. "O código de status 412 (Falha de pré-condição) indica que uma ou mais condições fornecidas nos campos do cabeçalho da solicitação foram avaliadas como falsas quando testadas no servidor."
oferei
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.