Entenda os códigos de resposta HTTP que você vê no console do navegador.
hidden: true
HTTP Status Codes
Quando seu app faz uma requisição, o servidor responde com um código numérico. Esse código diz se deu certo ou errado.
Os mais comuns
2xx — Sucesso ✅
| Código |
Significado |
| 200 |
OK — tudo certo |
| 201 |
Criado — recurso novo criado com sucesso |
| 204 |
Sem conteúdo — deu certo mas sem resposta |
3xx — Redirecionamento ↪️
| Código |
Significado |
| 301 |
Movido permanentemente |
| 302 |
Redirecionamento temporário |
| 304 |
Não modificado (use o cache) |
4xx — Erro do cliente ❌
| Código |
Significado |
| 400 |
Bad Request — dados enviados inválidos |
| 401 |
Não autorizado — precisa fazer login |
| 403 |
Proibido — logado mas sem permissão |
| 404 |
Não encontrado — URL não existe |
| 429 |
Muitas requisições — rate limit |
5xx — Erro do servidor 💥
| Código |
Significado |
| 500 |
Erro interno — bug no servidor |
| 502 |
Bad Gateway — servidor fora do ar |
| 503 |
Serviço indisponível — sobrecarga |
| 504 |
Gateway Timeout — servidor demorou demais |
Na prática
const response = await fetch("/api/users");
if (response.ok) {
// 200-299: sucesso
const data = await response.json();
} else if (response.status === 404) {
// Recurso não encontrado
console.log("Usuário não encontrado");
} else if (response.status === 401) {
// Precisa autenticar
redirect("/login");
} else {
// Outro erro
console.error("Erro:", response.status);
}
No backend
// Next.js API Route
export async function GET() {
return Response.json({ users: [] }, { status: 200 });
}
export async function POST(req: Request) {
const data = await req.json();
if (!data.email) {
return Response.json({ error: "Email obrigatório" }, { status: 400 });
}
const user = await db.user.create({ data });
return Response.json(user, { status: 201 });
}
Dica para debug
Quando seu app dá erro, o status code é a primeira pista:
- 4xx = problema no frontend (dados errados, URL errada, sem auth)
- 5xx = problema no backend (bug no código, banco fora do ar)