04 - DELETE - Remove Recurso
video: https://youtu.be/... no frontmatter da nota.DELETE - Remove Recurso
1. Definição e Semântica
O método HTTP DELETE é definido pela RFC 7231 (seção 4.3.5) como o método que solicita a remoção do recurso identificado pela URL alvo. Sua semântica é de "remove": o servidor deve apagar o recurso ou marcá-lo como removido, de forma que requisições subsequentes ao mesmo recurso indiquem ausência (tipicamente 404 Not Found).
Características Formais
- Método:
DELETE - Seguro: Não (modifica estado do servidor)
- Idempotente: Sim (deletar o mesmo recurso 1 ou 100 vezes leva ao mesmo estado: inexistente)
- Cacheável: Não (por padrão)
- Corpo na requisição: Opcional (não recomendado; alguns servidores ignoram)
- Corpo na resposta: Opcional
- RFC de referência: RFC 7231 §4.3.5 (obsoleta por RFC 9110)
Idempotência
DELETE é idempotente por definição. A primeira chamada remove o recurso; chamadas subsequentes encontram o recurso inexistente e tipicamente retornam 404 Not Found. O estado final do servidor é o mesmo: o recurso não existe. Isso garante segurança em retries.
DELETE /users/42 HTTP/1.1
Host: api.exemplo.com
Authorization: Bearer eyJ...
2. Soft Delete vs Hard Delete
Hard Delete
Remoção física do registro do banco de dados. Após o DELETE, o recurso desaparece completamente. Não há como recuperar.
DELETE FROM users WHERE id = 42;
Vantagens: libera espaço imediatamente, sem resíduos.
Desvantagens: irreversível; em caso de erro ou auditoria, o dado está perdido.
Soft Delete
Marca o recurso como removido (ex: deleted_at = NOW() ou flag is_active = false), sem apagar fisicamente. Requisições subsequentes retornam 404 para o cliente, mas o registro continua no banco.
UPDATE users SET deleted_at = NOW() WHERE id = 42;
Vantagens: recuperável, permite auditoria, mantém integridade referencial.
Desvantagens: requer filtragem em todas as queries (WHERE deleted_at IS NULL), acumula dados órfãos.
Boas Práticas
- APIs públicas: soft delete quase sempre, com política de expurgo (ex: hard delete após 90 dias).
- APIs administrativas: hard delete para dados sensíveis (LGPD/GDPR right to erasure).
- Bancos distribuídos: soft delete com campo
deleted_atpermite sincronização e recuperação tardia.
3. Códigos de Resposta Típicos
| Status | Significado | Quando usar |
|---|---|---|
| 200 OK | Sucesso com corpo | DELETE executado, retorna detalhes do recurso removido |
| 202 Accepted | Aceito, processamento assíncrono | DELETE enfileirado (ex: remoção de mídia pesada em background) |
| 204 No Content | Sucesso sem corpo | DELETE executado, sem payload de retorno |
| 400 Bad Request | Sintaxe inválida | URL malformada |
| 401 Unauthorized | Falta autenticação | Token ausente ou inválido |
| 403 Forbidden | Sem permissão | Autenticado, mas sem direito de exclusão |
| 404 Not Found | Recurso não existe | DELETE em URL inexistente (também é resposta idempotente válida) |
| 405 Method Not Allowed | Recurso não suporta DELETE | Ex: coleção só permite GET |
| 409 Conflict | Conflito de estado | Recurso bloqueado, integridade referencial |
| 410 Gone | Recurso permanentemente removido | Soft delete irreversível |
Convenção de Status
A escolha entre 200, 202 e 204 depende do contrato da API:
- 200 OK com corpo: cliente recebe confirmação com dados do recurso removido (ex:
{"deleted": true, "id": 42}). - 204 No Content: resposta vazia, mais econômica. Padrão comum em APIs REST modernas.
- 202 Accepted: usado em operações longas (ex: deletar usuário com milhares de registros relacionados). Cliente deve fazer polling de status ou aguardar webhook.
4. Autorização e Segurança
Autenticação Obrigatória
DELETE sempre deve exigir autenticação. Sem token/cookie válido, retornar 401 Unauthorized.
Autorização Granular
Mesmo autenticado, o cliente pode não ter permissão para deletar o recurso:
- Usuário comum: só pode deletar seus próprios recursos.
- Admin: pode deletar qualquer recurso.
Retornar 403 Forbidden quando o usuário autenticado tenta deletar recurso de terceiro.
CSRF Protection
DELETE via navegador (com cookies de sessão) está sujeito a CSRF. Mitigações:
- Token CSRF em header customizado (
X-CSRF-Token). - SameSite cookies (
SameSite=StrictouLax). - CORS estrito: permitir DELETE apenas de origens confiáveis.
- Custom header requirement: browsers só permitem headers customizados com preflight CORS, que bloqueia CSRF simples.
Confirmação do Cliente
Para recursos críticos (ex: deletar conta), exigir confirmação adicional: senha atual, token TOTP ou 2FA via SMS/email.
5. Headers Importantes
Authorization
Padrão para APIs REST (Bearer token JWT): Authorization: Bearer eyJhbGc....
If-Match
Concorrência otimista via ETag:
DELETE /users/42 HTTP/1.1
If-Match: "abc123"
Retorna 412 Precondition Failed se a ETag atual do recurso não casar (alguém modificou antes).
If-Unmodified-Since
Concorrência baseada em tempo: If-Unmodified-Since: Wed, 21 Oct 2023 07:28:00 GMT.
6. Exemplos Práticos
curl — Deletar Recurso (204)
curl -X DELETE https://api.exemplo.com/users/42 \
-H "Authorization: Bearer $TOKEN" \
-w "%{http_code}\n" -o /dev/null -s
# Saída: 204
curl — Deletar com If-Match
curl -X DELETE https://api.exemplo.com/users/42 \
-H "Authorization: Bearer $TOKEN" \
-H 'If-Match: "v3"'
Python (requests)
import requests
r = requests.delete(
"https://api.exemplo.com/users/42",
headers={"Authorization": "Bearer " + token},
)
if r.status_code == 204:
print("Deletado com sucesso")
elif r.status_code == 404:
print("Recurso não existe (idempotente)")
7. Boas Práticas em APIs REST
- Resposta consistente: Para
200 OK, retorne payload informativo{"deleted": true, "id": 42, "deleted_at": "2024-01-15T10:30:00Z"}. Para204, resposta vazia. - Soft delete com restauração: Exponha
POST /users/42/restorepara recuperar soft-deletados dentro da janela de tolerância. - Idempotency-Key: Aceite header
Idempotency-Key: 550e8400-...para evitar duplicações em retries. - Auditoria: Log de DELETEs críticos (quem, quando, qual recurso, com qual IP). Necessário para conformidade LGPD/GDPR/SOC2.
- Rate limiting: Aplique rate limits por cliente para evitar abuso (ex: DELETE em massa).
8. Erros Comuns
| Erro | Causa | Correção |
|---|---|---|
| 405 Method Not Allowed | Servidor só aceita POST | Padronizar DELETE para remoção |
| 401 em vez de 403 | Token válido mas sem permissão | Diferenciar 401 (não autenticado) de 403 (sem permissão) |
| Recurso recriado por PUT | DELETE seguido de PUT cria novo | Considerar 410 Gone para soft delete irreversível |
| Body ignorado | Servidor não lê corpo do DELETE | Não depender de body; usar query string ou URL |
9. Resumo Técnico
| Atributo | Valor |
|---|---|
| Método | DELETE |
| RFC | 7231 §4.3.5 (obsoleta por 9110) |
| Idempotente | Sim |
| Seguro | Não |
| Cacheável | Não |
| Corpo na requisição | Opcional (não recomendado) |
| Sucessos típicos | 200, 202, 204 |
| Concorrência | ETag + If-Match |
| Proteção L7 | CSRF token, SameSite, CORS |
10. Conclusão
O método DELETE é o mecanismo HTTP padrão para remoção de recursos. Sua idempotência permite retries seguros, mas a decisão entre hard delete e soft delete depende de requisitos de negócio, conformidade e auditabilidade. Boas práticas como autenticação obrigatória, autorização granular, proteção CSRF, e uso de If-Match para concorrência otimista são essenciais. A escolha entre 200, 202 e 204 reflete o tipo de operação executada (síncrona com retorno, assíncrona, ou silenciosa) e deve ser documentada no contrato da API.