Código de status HTTP · Sucesso (2xx)
200 OK
O 200 OK significa que o pedido deu certo e a resposta traz o resultado: a página ou os dados num GET, o resultado da ação num POST. É o status que quase todo framework envia por padrão quando o handler retorna sem definir outro.
| Classe | 2xx, Sucesso |
|---|---|
| Definido em | RFC 9110 §15.3.1 |
| Pode ir para o cache por padrão | Sim, de forma heurística; em GET e HEAD; envie ETag ou Last-Modified para os caches poderem revalidar |
| Pode repetir o pedido | Não é preciso; o pedido deu certo |
| Cabeçalhos relevantes |
|
O que significa o 200
A RFC 9110, seção 15.3.1, liga o significado do corpo ao método: no GET é o recurso, no HEAD os mesmos cabeçalhos sem corpo, no POST o resultado da ação, no PUT e no DELETE a situação da ação. No CONNECT um 200 indica que o túnel está aberto e não tem corpo.
O 200 pode ser armazenado em cache de forma heurística, então navegador ou CDN podem reaproveitá-lo sem perguntar de novo, a menos que o Cache-Control diga o contrário. Para GET e HEAD a especificação pede validadores, de preferência um ETag forte e o Last-Modified, e é isso que permite que os próximos pedidos recebam um 304 barato em vez do corpo inteiro.
O 200 só diz que a troca HTTP funcionou. Muitos sistemas devolvem 200 com um erro dentro: servidores GraphQL colocam falhas num array errors, algumas APIs embrulham tudo em { "success": false } e sites mal configurados servem a página de "não encontrado" com 200. Um monitoramento que só olha o status vai achar tudo isso saudável.
Quando usar
- GET que devolve o recurso ou uma lista, mesmo que vazia.
- POST que executa uma ação sem criar um recurso com URL própria: uma busca, um cálculo, um login que devolve um token.
- PUT ou PATCH que devolve o recurso atualizado no corpo (use 204 se não devolver nada).
Causas comuns
Se você está visitando o site
- A página dá 200 mas mostra conteúdo antigo: o DevTools indica "(disk cache)" ou "(memory cache)", ou seja, o navegador nem consultou o servidor.
Se você administra o servidor
- Página em branco com status 200: o HTML carregou, mas o bundle JavaScript deu erro, então o problema está no console, não na rede.
- Uma página de erro, um resultado vazio ou um login recusado sai com 200, e clientes, buscadores e monitores de uptime entendem como sucesso.
- Um usuário vê dados de outro: uma CDN guardou um 200 personalizado porque faltava Cache-Control: private.
Como resolver
Se você está visitando o site
- Recarregue forçado com Ctrl+Shift+R (Cmd+Shift+R no macOS) para ignorar a cópia em cache.
Se você administra o servidor
- Devolva o status que corresponde ao resultado: 404 para ausente, 401 ou 403 para falha de acesso, 422 para dados inválidos.
- Marque respostas por usuário com Cache-Control: private, no-store e versione os arquivos estáticos para que max-age longo seja seguro.
- Aponte o monitor de uptime para um endpoint de saúde que só responde 200 quando as dependências respondem.
Como enviar um 200
app.get('/reports/:id', (req, res) => {
res.status(200).json({ id: '42', title: 'Q3 revenue' });
});// app/reports/[id]/route.ts
export async function GET() {
return Response.json({ id: '42', title: 'Q3 revenue' }, { status: 200 });
}mux.HandleFunc("GET /reports/{id}", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK) // 200
w.Write([]byte(`{"id":"42","title":"Q3 revenue"}`))
})from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
@app.get("/reports/{id}")
def get_report(id: str):
return JSONResponse(status_code=200, content={"id": "42", "title": "Q3 revenue"})# Health check answered by nginx itself
location = /healthz {
access_log off;
default_type text/plain;
return 200 "ok\n";
}Costuma ser confundido com
- 200 vs 201
- O 201 Created diz que um novo recurso passou a existir (e onde, via Location); o 200 num POST só diz que a ação funcionou.
- 200 vs 204
- O 204 No Content é um sucesso sem nada no corpo; do 200 se espera que traga conteúdo.
- 200 vs 304
- O 304 indica que o navegador perguntou e o servidor confirmou que a cópia em cache ainda vale; "200 (from cache)" indica que o navegador nem perguntou.
Perguntas frequentes
- Status 200 OK sempre significa sucesso?
- Significa que o pedido HTTP deu certo, não necessariamente a sua operação. Algumas APIs e servidores GraphQL devolvem 200 com um erro no corpo, então confira também o formato de resposta que a API documenta.
- O que significa "200 (from disk cache)" no DevTools?
- O navegador reaproveitou uma cópia guardada sem falar com o servidor, porque a resposta em cache ainda estava válida pelo Cache-Control ou pela validade heurística. Nenhum pedido saiu da sua máquina.
- Um POST deve responder 200 ou 201?
- Responda 201 Created quando o POST cria um recurso com URL própria, e inclua Location. Responda 200 quando ele executa uma ação ou devolve um resultado calculado sem criar nada endereçável.
- Uma resposta 200 pode ter corpo vazio?
- Pode, com Content-Length: 0, mas a RFC 9110 espera que o 200 traga conteúdo e recomenda o 204 No Content quando não há nada a devolver de propósito.
Revisado em por Arielton Oberek.