Skip to content

Código de status HTTP · Sucesso (2xx)

204 No Content

O 204 No Content significa que o pedido deu certo e, de propósito, não há corpo na resposta. É a resposta comum para DELETE, para PUT ou PATCH que salva sem devolver o recurso e para o preflight de CORS; o bug clássico é o código do cliente chamar response.json() nela.

Dados sobre este código de status
Classe2xx, Sucesso
Definido emRFC 9110 §15.3.5
Pode ir para o cache por padrãoSim, de forma heurística
Pode repetir o pedidoNão é preciso; o pedido deu certo
Cabeçalhos relevantes
  • ETag: depois de um PUT, o entity tag da nova representação, mesmo sem corpo

O que significa o 204

A RFC 9110, seção 15.3.5, diz que o 204 termina junto com os cabeçalhos: não pode ter conteúdo nem trailers. Os cabeçalhos continuam valendo e descrevem o recurso depois da ação, então um 204 a um PUT com ETag informa o novo entity tag sem reenviar os dados.

O código também quer dizer "fique onde está". Um formulário enviado para um endpoint que responde 204 mantém o navegador na página atual, e é por isso que a especificação cita o botão salvar de editores de documentos.

O padrão Fetch trata o 204 como status de corpo nulo. new Response("x", { status: 204 }) lança TypeError, e response.json() num 204 de verdade falha com "Unexpected end of JSON input".

Quando usar

  • DELETE /relatorios/42 que deu certo.
  • PUT ou PATCH em que o cliente já tem os dados que enviou e não precisa de eco.
  • Respostas ao preflight de CORS (OPTIONS), beacons de analytics enviados com navigator.sendBeacon e o velho truque de responder 204 em /favicon.ico.

Causas comuns

Se você administra o servidor

  • O frontend quebra com SyntaxError: Unexpected end of JSON input porque interpreta toda resposta como JSON, inclusive o 204 vazio.
  • O handler tenta mandar corpo com 204: o Express descarta em silêncio, o Write do Go devolve http.ErrBodyNotAllowed e um servidor feito à mão pode corromper a próxima resposta numa conexão keep-alive.

Como resolver

Se você administra o servidor

  • No cliente, verifique res.status === 204 (ou o Content-Length) antes de chamar res.json().
  • Se o cliente precisa do objeto atualizado, devolva 200 com corpo em vez de 204.

Como enviar um 204

Express (Node.js)
app.delete('/reports/:id', (req, res) => {
  res.status(204).end();
});
Next.js App Router (route handler)
// app/reports/[id]/route.ts
export async function DELETE() {
  return new Response(null, { status: 204 });
}
Go net/http
mux.HandleFunc("DELETE /reports/{id}", func(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(http.StatusNoContent) // 204
})
Python FastAPI
from fastapi import FastAPI, Response

app = FastAPI()

@app.delete("/reports/{id}")
def delete_report(id: str):
    return Response(status_code=204)
Nginx
location /api/ {
  # Answer CORS preflight without hitting the app
  if ($request_method = OPTIONS) {
    add_header Access-Control-Allow-Origin "https://app.example.com";
    add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE";
    add_header Access-Control-Allow-Headers "Authorization, Content-Type";
    add_header Access-Control-Max-Age 86400;
    return 204;
  }
  proxy_pass http://app;
}

Costuma ser confundido com

204 vs 200
Do 200 se espera um corpo; o 204 garante que não há nenhum, então o cliente não deve tentar interpretar.
204 vs 205
O 205 Reset Content também vem sem corpo, mas ainda pede ao cliente que limpe o formulário ou a tela que enviou o pedido.
204 vs 404
Num DELETE de algo que já não existe, algumas APIs respondem 404 e outras 204 para manter o DELETE idempotente do ponto de vista do cliente; escolha um e documente.

Perguntas frequentes

Uma resposta 204 pode ter corpo?
Não. A RFC 9110 diz que o 204 termina no fim dos cabeçalhos e não pode ter conteúdo nem trailers. Os frameworks removem ou recusam qualquer corpo que você tente enviar.
DELETE deve devolver 204 ou 200?
Devolva 204 quando não há nada útil a mandar de volta, que é o caso comum. Devolva 200 se incluir algo, como o objeto apagado ou um resumo do que foi removido.
Por que o fetch() dá erro com resposta 204?
Não é o fetch, é a leitura do corpo. response.json() num corpo vazio falha com "Unexpected end of JSON input". Confira response.status === 204 antes de interpretar.
O que o navegador faz quando um formulário recebe 204?
Ele continua na página atual e não navega. Isso torna o 204 útil para endpoints de salvar ou de rastreamento em que o usuário não deve sair da página.

Revisado em por Arielton Oberek.