Skip to main content

Curl Cheat Sheet

·1457 words·7 mins
timEU
Author
timEU

Esta página contém uma lista dos comandos cURL mais utilizados para fazer requisições HTTP/HTTPS e interagir com APIs.

Requisições Básicas
#

curl https://exemplo.com                        # Requisição GET básica
curl -X GET https://exemplo.com                 # GET explícito
curl -X POST https://exemplo.com                # Requisição POST
curl -X PUT https://exemplo.com                 # Requisição PUT
curl -X DELETE https://exemplo.com              # Requisição DELETE
curl -X PATCH https://exemplo.com               # Requisição PATCH
curl -X HEAD https://exemplo.com                # Requisição HEAD (apenas headers)
curl -X OPTIONS https://exemplo.com             # Requisição OPTIONS

Headers (Cabeçalhos)
#

curl -H "Content-Type: application/json" url   # Definir header
curl -H "Authorization: Bearer token" url      # Header de autorização
curl -H "User-Agent: MeuApp/1.0" url          # Definir User-Agent
curl -H "Accept: application/json" url         # Definir tipo aceito
curl -H "X-Custom-Header: valor" url           # Header customizado
curl -A "MeuUserAgent" url                     # Definir User-Agent (forma curta)

Múltiplos Headers
#

curl -H "Content-Type: application/json" \
     -H "Authorization: Bearer token" \
     -H "Accept: application/json" \
     https://api.exemplo.com

Dados POST/PUT
#

# Dados simples
curl -d "nome=João&idade=30" url               # Dados form-encoded
curl -d '{"nome":"João","idade":30}' url       # Dados JSON inline

# A partir de arquivo
curl -d @dados.txt url                         # Dados de arquivo texto
curl -d @dados.json url                        # Dados de arquivo JSON

# JSON com header correto
curl -X POST \
     -H "Content-Type: application/json" \
     -d '{"nome":"João","idade":30}' \
     https://api.exemplo.com/usuarios

Upload de Arquivos
#

curl -F "arquivo=@/caminho/arquivo.pdf" url    # Upload com form multipart
curl -F "campo=valor" -F "arquivo=@foto.jpg" url # Múltiplos campos
curl --form "arquivo=@documento.pdf" url       # Sintaxe alternativa
curl -T arquivo.txt ftp://servidor/upload/     # Upload direto (FTP/HTTP PUT)

Autenticação
#

# Basic Auth
curl -u usuario:senha url                      # Autenticação básica
curl -u usuario url                            # Solicita senha interativamente
curl --basic -u usuario:senha url              # Forçar Basic Auth

# Bearer Token
curl -H "Authorization: Bearer SEU_TOKEN" url  # Token de autorização

# API Key
curl -H "X-API-Key: SUA_CHAVE" url            # API Key personalizada

# Digest Auth
curl --digest -u usuario:senha url             # Autenticação Digest

Cookies
#

curl -c cookies.txt url                        # Salvar cookies em arquivo
curl -b cookies.txt url                        # Usar cookies de arquivo
curl -b "session=abc123; user=joao" url        # Cookies inline
curl -c - -b cookies.txt url                   # Salvar e usar cookies

Redirecionamentos
#

curl -L url                                    # Seguir redirecionamentos
curl -L --max-redirs 5 url                    # Limitar número de redirecionamentos
curl --location-trusted url                   # Seguir redirecionamentos mantendo auth

Saída e Formatação
#

curl -o arquivo.html url                       # Salvar em arquivo específico
curl -O url/arquivo.zip                        # Salvar com nome original
curl -s url                                    # Modo silencioso (sem progress)
curl -v url                                    # Modo verbose (detalhes da requisição)
curl -i url                                    # Incluir headers na saída
curl -I url                                    # Apenas headers (HEAD request)
curl -w "%{http_code}" url                     # Mostrar código HTTP

Informações de Debug
#

curl -v url                                    # Verbose - mostrar tudo
curl -vv url                                   # Extra verbose
curl --trace trace.txt url                    # Salvar trace completo
curl --trace-ascii trace.txt url              # Trace em ASCII
curl -w "@format.txt" url                     # Usar arquivo de formato personalizado

Formato de Saída Personalizado
#

# Criar arquivo format.txt
echo 'Status: %{http_code}\nTempo: %{time_total}s\nTamanho: %{size_download} bytes' > format.txt
curl -w "@format.txt" url

# Ou inline
curl -w "Status: %{http_code}\nTempo: %{time_total}s\n" url

Variáveis de Formato Úteis
#

%{http_code}                                   # Código de status HTTP
%{time_total}                                  # Tempo total da requisição
%{time_namelookup}                             # Tempo de resolução DNS
%{time_connect}                                # Tempo de conexão
%{size_download}                               # Bytes baixados
%{size_upload}                                 # Bytes enviados
%{speed_download}                              # Velocidade de download
%{url_effective}                               # URL final (após redirecionamentos)

Timeouts e Limites
#

curl --connect-timeout 10 url                 # Timeout de conexão (segundos)
curl --max-time 30 url                        # Timeout total da requisição
curl --retry 3 url                            # Número de tentativas
curl --retry-delay 2 url                      # Delay entre tentativas
curl --retry-max-time 60 url                  # Tempo máximo para tentativas

Proxy
#

curl --proxy http://proxy:8080 url            # Usar proxy HTTP
curl --proxy socks5://proxy:1080 url          # Usar proxy SOCKS5
curl --proxy-user usuario:senha url           # Autenticação no proxy
curl --noproxy localhost,127.0.0.1 url        # Pular proxy para hosts específicos

SSL/TLS
#

curl -k url                                    # Ignorar erros de certificado SSL
curl --insecure url                            # Sintaxe alternativa
curl --cacert certificado.pem url             # Usar certificado CA específico
curl --cert client.pem url                    # Certificado do cliente
curl --key private.key url                    # Chave privada do cliente
curl --tlsv1.2 url                           # Forçar versão TLS específica

Rate Limiting e Controle
#

curl --limit-rate 100k url                    # Limitar velocidade de download
curl --max-filesize 1048576 url              # Limite máximo de arquivo (bytes)
curl -Z url1 url2 url3                       # Downloads paralelos
curl --parallel-max 5 url1 url2 url3         # Máximo de downloads paralelos

APIs REST Comuns
#

GET com Parâmetros de Query
#

curl "https://api.exemplo.com/users?page=1&limit=10"
curl -G -d "page=1" -d "limit=10" https://api.exemplo.com/users

POST JSON
#

curl -X POST \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer TOKEN" \
     -d '{
       "nome": "João Silva",
       "email": "joao@exemplo.com",
       "idade": 30
     }' \
     https://api.exemplo.com/users

PUT para Atualização
#

curl -X PUT \
     -H "Content-Type: application/json" \
     -d '{"nome":"João Santos","idade":31}' \
     https://api.exemplo.com/users/123

DELETE
#

curl -X DELETE \
     -H "Authorization: Bearer TOKEN" \
     https://api.exemplo.com/users/123

Testes de API
#

Verificar Status da API
#

curl -I https://api.exemplo.com/health         # Verificar se API está online
curl -w "%{http_code}" -o /dev/null -s url     # Apenas código de status

Medir Performance
#

curl -w "DNS: %{time_namelookup}s\nConexão: %{time_connect}s\nTotal: %{time_total}s\n" url

Teste de Load Básico
#

for i in {1..10}; do
    curl -w "Requisição $i: %{http_code} - %{time_total}s\n" \
         -o /dev/null -s url
done

Trabalhar com Formulários Web
#

Formulário Simples
#

curl -d "username=joao&password=123456" \
     -X POST \
     https://site.com/login

Formulário com Arquivo
#

curl -F "nome=João" \
     -F "arquivo=@documento.pdf" \
     -F "categoria=documentos" \
     https://site.com/upload

GraphQL
#

curl -X POST \
     -H "Content-Type: application/json" \
     -d '{
       "query": "query { users { id name email } }",
       "variables": {}
     }' \
     https://api.exemplo.com/graphql

Webhooks e Callbacks
#

Simular Webhook
#

curl -X POST \
     -H "Content-Type: application/json" \
     -d '{
       "evento": "pagamento_aprovado",
       "id": "12345",
       "valor": 99.99
     }' \
     https://meusite.com/webhook/pagamento

FTP com cURL
#

curl ftp://servidor/arquivo.txt               # Download de arquivo FTP
curl -u usuario:senha ftp://servidor/         # FTP com autenticação
curl -T arquivo.txt ftp://servidor/upload/    # Upload via FTP
curl ftp://servidor/ -u usuario:senha --list-only # Listar arquivos

Múltiplas Requisições
#

URLs em Sequência
#

curl url1 url2 url3                           # Múltiplas URLs
curl "https://api.com/page[1-5]"              # Range numérico
curl "https://api.com/user{alice,bob,carol}"  # Múltiplas opções

Arquivo com URLs
#

# Criar arquivo urls.txt com uma URL por linha
curl -K urls.txt                              # Executar URLs do arquivo

Configuração Global
#

Arquivo .curlrc
#

Criar arquivo ~/.curlrc com configurações padrão:

# Sempre seguir redirecionamentos
-L

# Mostrar barra de progresso
--progress-bar

# User-Agent padrão
user-agent = "MeuApp/1.0"

# Timeout padrão
connect-timeout = 10
max-time = 30

Casos de Uso Avançados
#

API com Paginação
#

#!/bin/bash
page=1
while true; do
    response=$(curl -s "https://api.exemplo.com/users?page=$page")
    echo "$response" | jq '.data[]' || break
    ((page++))
done

Health Check
#

#!/bin/bash
if curl -f -s --max-time 5 https://api.exemplo.com/health > /dev/null; then
    echo "API está funcionando"
else
    echo "API está com problemas"
fi

Download com Retry
#

curl --retry 3 \
     --retry-delay 5 \
     --retry-max-time 60 \
     -C - \
     -o arquivo.zip \
     https://servidor.com/arquivo.zip

Análise de Resposta
#

Usar com jq para JSON
#

curl -s https://api.exemplo.com/users | jq '.'
curl -s https://api.exemplo.com/users | jq '.data[0].name'

Extrair Headers Específicos
#

curl -I url | grep -i content-type            # Extrair content-type
curl -s -D headers.txt url                     # Salvar headers em arquivo

Debugging e Troubleshooting
#

Problemas de SSL
#

curl -vv url 2>&1 | grep -i ssl               # Debug SSL específico
curl --ciphers ECDHE-RSA-AES128-GCM-SHA256 url # Forçar cipher específico

Problemas de DNS
#

curl --resolve exemplo.com:443:1.2.3.4 url    # Forçar resolução DNS
curl --dns-servers 8.8.8.8,8.8.4.4 url       # Usar DNS específico

Trace de Rede
#

curl --trace-ascii trace.log url              # Trace completo
curl --trace-time url                         # Timestamps no trace

Exemplos Práticos
#

API do GitHub
#

# Buscar repositórios
curl -H "Authorization: token SEU_TOKEN" \
     https://api.github.com/user/repos

# Criar issue
curl -X POST \
     -H "Authorization: token SEU_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{"title":"Bug report","body":"Descrição do bug"}' \
     https://api.github.com/repos/usuario/repo/issues

API do Slack
#

# Enviar mensagem
curl -X POST \
     -H "Authorization: Bearer xoxb-SEU-TOKEN" \
     -H "Content-Type: application/json" \
     -d '{"channel":"#geral","text":"Olá do cURL!"}' \
     https://slack.com/api/chat.postMessage

Monitoramento Simples
#

# Script de monitoramento
#!/bin/bash
while true; do
    status=$(curl -o /dev/null -s -w "%{http_code}" https://meusite.com)
    if [ $status -ne 200 ]; then
        echo "$(date): Site fora do ar - Status: $status"
    fi
    sleep 300  # Verificar a cada 5 minutos
done

Dicas e Boas Práticas
#

Performance
#

  • Use -s para requisições em scripts
  • Use --compressed para aceitar compressão
  • Configure timeouts apropriados

Segurança
#

  • Nunca coloque senhas em linha de comando (visíveis no histórico)
  • Use variáveis de ambiente para tokens
  • Valide certificados SSL em produção

Debugging
#

  • Use -v para ver detalhes da requisição
  • Use --trace-ascii para debugging completo
  • Salve requisições importantes em arquivos

Scripts
#

# Usar variáveis para URLs e tokens
API_URL="https://api.exemplo.com"
TOKEN=$(cat ~/.api-token)

curl -H "Authorization: Bearer $TOKEN" \
     "$API_URL/endpoint"