Ir para o conteúdo

Códigos de status HTTP

Uma resposta HTTP começa com um código de três dígitos e uma frase de motivo curta. O primeiro dígito é o resumo completo: 1xx é provisório, 2xx sucessu, 3xx aponta para outro lugar, 4xx culpa a solicitação, 5xx culpa o servidor. Se você se lembrar apenas disso, você pode ler um log que nunca viu antes.

As frases de motivo aqui são as dos RFCs, em inglês, porque é isso que viaja no fio — um servidor envia "Not Found", não uma tradução disso, e uma frase que você está procurando em um log tem que corresponder aos bytes que realmente foram enviados.

As distinções que causam problemas reais estão dentro das classes em vez de entre elas: 401 versus 403, 301 versus 308, e 502 versus 503 cada uma responde uma pergunta diferente sobre o que fazer em seguida, e cada uma é rotineiramente usada para a outra.

1xx — Informacional

3

Provisório: a resposta não é final e outra segue.

CódigoFrase de motivoO que significa
100ContinueCabeçalhos recebidos, continue enviando o corpo.
101Switching ProtocolsProtocolos de comutação — o handshake WebSocket.
103Early HintsDicas antecipadas: pré-carregue esses recursos enquanto a resposta real é preparada.

2xx — Sucesso

5

A solicitação foi recebida, compreendida e aceita.

CódigoFrase de motivoO que significa
200OKSucesso, com um corpo.
201CreatedCriado.Deve levar um cabeçalho Location apontando para o novo recurso.
202AcceptedAceito para processamento, que ainda não ocorreu.
204No ContentSucesso, e deliberadamente sem corpo.A resposta certa para um DELETE, ou um save sem nada para retornar.
206Partial ContentConteúdo parcial — a resposta a um pedido de Range. Downloads retomáveis.

3xx — Redirecionamento

6

O recurso está em outro lugar, ou sua cópia em cache ainda é boa.

CódigoFrase de motivoO que significa
301Moved PermanentlyMovido permanentemente. Atualize seus links; caches podem manter isso para sempre.
302FoundEncontrado — um redirecionamento temporário.Amplamente implementado como trocar o método para GET, que 307 corrige.
303See OtherVer outro: busque o resultado com GET. O redirecionamento após um POST de formulário.
304Not ModifiedNão modificado — sua cópia em cache está atual. Enviado sem corpo.
307Temporary RedirectRedirecionamento temporário, método e corpo preservados.
308Permanent RedirectRedirecionamento permanente, método e corpo preservados.

4xx — Erro do cliente

14

A solicitação é o problema. Repeti-la inalterada falhará novamente.

CódigoFrase de motivoO que significa
400Bad RequestO servidor não conseguiu analisar a solicitação.
401UnauthorizedNão autenticado — o servidor não sabe quem você é.Nomeado Unauthorized, mas significa não autenticado. Deve incluir WWW-Authenticate.
403ForbiddenAutenticado e ainda não permitido. Credenciais melhores não ajudarão.
404Not FoundNenhum recurso assim, e o servidor não dirá se já houve um.
405Method Not AllowedMétodo errado para este URL.Deve listar aqueles que funcionam em um cabeçalho Allow.
406Not AcceptableNada disponível em um formato que seu cabeçalho Accept aceitará.
409ConflictEntra em conflito com o estado atual — uma edição contra uma versão obsoleta.
410GoneDesaparecido: existiu e foi deliberadamente removido. Mais forte que 404.
413Content Too LargeO corpo é maior que o servidor aceita.
415Unsupported Media TypeO servidor não lida com este Content-Type.
418I'm a teapotSou uma chaleira. Uma piada de Páscoas de Abril de 1998, permanentemente reservada.
422Unprocessable ContentAnalisado corretamente, conteúdo inválido — um campo ausente, um valor ruim.
429Too Many RequestsTaxa limitada.Procure por Retry-After antes de retentar, e recue exponencialmente.
451Unavailable For Legal ReasonsBloqueado por razões legais. O número é uma referência a Fahrenheit 451.

5xx — Erro do servidor

6

A solicitação pode ser adequada. Estes são aqueles que valem a pena retentar.

CódigoFrase de motivoO que significa
500Internal Server ErrorUm erro não tratado no servidor. Nada para corrigir do seu lado.
501Not ImplementedO servidor não implementa este método.
502Bad GatewayUm proxy chegou ao servidor upstream e obteve algo inutilizável.
503Service UnavailableDeliberadamente não servindo — sobrecarregado ou em manutenção.O status que deve carregar Retry-After.
504Gateway TimeoutUm proxy desistiu de esperar pelo servidor upstream.
505HTTP Version Not SupportedA versão HTTP na solicitação não é suportada.

FAQ

Qual é a diferença entre 401 e 403?
401 Unauthorized significa que a solicitação não foi autenticada — o servidor não sabe quem você é, e um 401 correto inclui um cabeçalho WWW-Authenticate dizendo como você pode provar isso. 403 Forbidden significa que sabe exatamente quem você é e você ainda pode não ter isso. Retentar um 403 com credenciais melhores para a mesma identidade não ajudará.
Devo usar 301 ou 308 para um redirecionamento?
308 se o método importar. Historicamente, 301 e 302 foram amplamente implementados como "redirecionar e mudar para GET", que silenciosamente transforma um POST em um GET. 307 e 308 foram introduzidos para prometer que o método e o corpo são preservados. Para uma mudança permanente de uma página que é apenas buscada, 301 permanece a escolha mais bem compreendida.
O que 422 significa que 400 não?
400 Bad Request significa que o servidor não conseguiu entender a solicitação — JSON malformado, um cabeçalho quebrado. 422 Unprocessable Content significa que foi analisado corretamente e o conteúdo está errado de qualquer maneira: um corpo bem formado com um campo obrigatório ausente ou uma data no passado. A divisão é útil precisamente porque o conserto do cliente é diferente em cada caso.
418 é um código de status real?
É real porque está registrado e cada biblioteca HTTP o conhece, e uma piada porque vem do Hyper Text Coffee Pot Control Protocol dos Páscoas de Abril de 1998. Tentativas de recuperar o número para uso prático foram rejeitadas, então está permanentemente reservado para bules.
Por que 503 é diferente de 502?
502 Bad Gateway significa que um proxy chegou ao servidor upstream e obteve algo inutilizável. 503 Service Unavailable significa que o próprio servidor deliberadamente não está servindo agora — sobrecarregado ou em manutenção — e é aquele que deve carregar um cabeçalho Retry-After, porque é aquele que deve se recuperar.