Aprender / Cheat sheet
Cheat sheet de HTTP para testes de API
O que um tester precisa de HTTP em uma folha só: quais métodos são seguros e idempotentes, qual código de status cada situação deve retornar, os headers que valem uma asserção, as flags de cURL que você vai usar todo dia e um checklist para cada resposta.
Conferido com Semântica HTTP conforme a RFC 9110; Problem Details conforme a RFC 9457
Métodos
| Método | Uso | Seguro | Idempotente |
|---|---|---|---|
GET | Ler um recurso ou uma coleção | Sim | Sim |
HEAD | Como o GET, só os headers | Sim | Sim |
OPTIONS | Métodos permitidos; preflight de CORS | Sim | Sim |
POST | Criar, ou executar uma ação | Não | Não |
PUT | Substituir o recurso inteiro | Não | Sim |
PATCH | Alterar alguns campos | Não | Não garantido |
DELETE | Remover um recurso | Não | Sim |
Idempotente significa que repetir a requisição deixa o servidor no mesmo estado. A resposta pode mudar: um segundo DELETE pode retornar 404.
Códigos de status a verificar
| Código | Significado | Teste típico |
|---|---|---|
200 OK | Sucesso com corpo | GET de um recurso existente |
201 Created | Recurso criado | POST com dados válidos; confira o header Location |
204 No Content | Sucesso, corpo vazio | DELETE, ou PUT que não retorna nada |
301 / 308 | Movido permanentemente | URL antiga redireciona; o 308 mantém o método |
304 Not Modified | A cópia em cache continua válida | GET com If-None-Match: <etag> |
400 Bad Request | Requisição malformada | JSON inválido, tipos errados |
401 Unauthorized | Não autenticado | Token ausente ou expirado |
403 Forbidden | Autenticado, mas sem permissão | Acessar o recurso de outro usuário |
404 Not Found | Recurso inexistente | Id desconhecido (ou ocultando um que você não pode ver) |
405 Method Not Allowed | Método errado para esta URL | DELETE em um endpoint somente leitura |
409 Conflict | Conflita com o estado atual | E-mail duplicado, versão desatualizada |
415 Unsupported Media Type | Formato do corpo não aceito | Enviar text/plain para um endpoint JSON |
422 Unprocessable Content | JSON válido, valores inválidos | Erros de validação de regras de negócio |
429 Too Many Requests | Rate limit atingido | Rajada de requisições; confira o Retry-After |
500 Internal Server Error | Bug no servidor | Nunca é esperado: é sempre um defeito |
502 / 503 / 504 | Falha upstream, indisponível, timeout | Dependência fora do ar; confira os retries |
Headers que vale verificar
| Header | Exemplo | Por quê |
|---|---|---|
Content-Type | application/json; charset=utf-8 | O formato da resposta corresponde ao corpo |
Accept | application/json | O cliente pede um formato; espere 406 se não for suportado |
Authorization | Bearer eyJhbGciOi… | Autenticação por token; ausente → 401 |
Location | /api/orders/1043 | Enviado no 201 Created e em redirecionamentos |
Cache-Control | no-store | Dados pessoais ou sensíveis não podem ir para cache |
ETag / If-None-Match | "a1b2c3" | GET condicional → 304 |
Retry-After | 30 | Enviado com 429 ou 503 |
Set-Cookie | sid=…; HttpOnly; Secure; SameSite=Lax | Cookies de sessão precisam de HttpOnly e Secure |
Access-Control-Allow-Origin | https://app.example.com | CORS: nunca * em requisições com credenciais |
cURL
| Tarefa | Código |
|---|---|
| Mostrar status e headers | curl -i https://api.example.com/users/1 |
| Trace completo da requisição/resposta | curl -v https://api.example.com/users/1 |
| POST com JSON | curl -X POST https://api.example.com/users \
-H 'Content-Type: application/json' \
-d '{"email":"qa@example.com"}' |
| Token Bearer | curl -H "Authorization: Bearer $TOKEN" https://api.example.com/me |
| Basic auth | curl -u user:pass https://api.example.com/admin |
| Seguir redirecionamentos | curl -L https://example.com/old |
| Só o código de status | curl -s -o /dev/null -w '%{http_code}' https://api.example.com/health |
| Falhar em 4xx/5xx em scripts | curl --fail-with-body https://api.example.com/health |
No cmd do Windows, troque as aspas simples por aspas duplas e escape as internas.
Checklist para cada resposta
| Verificação | Exemplo |
|---|---|
| Código de status | Exatamente 201, e não "qualquer 2xx" |
| Schema do corpo | Campos obrigatórios presentes, tipos corretos, nenhum campo sensível a mais |
| Valores | A entrada ecoada confere; campos calculados (totais, datas) estão certos |
| Headers | Content-Type, Location, Cache-Control |
| Formato de erro | Formato de erro consistente (ex.: problem details da RFC 9457) com uma mensagem útil |
| Efeitos colaterais | O registro existe, ou não existe, quando você faz um GET dele |
| Tempo de resposta | Dentro do orçamento combinado |