Curl e wget: requisições HTTP no terminal

1. Introdução às ferramentas

Curl e wget são duas das ferramentas mais essenciais para qualquer profissional que trabalhe com Bash/Shell Script. Ambas permitem realizar requisições HTTP diretamente do terminal, mas possuem origens e focos distintos.

O curl (Client URL) foi criado por Daniel Stenberg em 1997 e suporta dezenas de protocolos além do HTTP/HTTPS, como FTP, SFTP, SCP, LDAP e muitos outros. É amplamente utilizado em scripts para integração com APIs REST e automação de tarefas web.

O wget (World Wide Web Get) foi desenvolvido por Hrvoje Nikšić em 1996, com foco principal em download de arquivos e páginas web. Sua grande vantagem está no download recursivo e na capacidade de retomar downloads interrompidos.

Diferenças fundamentais:
- Curl é mais adequado para requisições complexas e interação com APIs
- Wget é superior para downloads em lote e mirror de sites
- Curl exibe o conteúdo no terminal por padrão; wget salva em arquivo
- Wget lida melhor com downloads interrompidos (resume)

Instalação e verificação:

# Verificar se estão instalados
curl --version
wget --version

# Instalação no Ubuntu/Debian
sudo apt install curl wget

# Instalação no CentOS/RHEL
sudo yum install curl wget

2. Requisições básicas com curl

A sintaxe fundamental do curl é simples e direta:

# Exibir conteúdo de uma URL no terminal
curl https://api.github.com

# Salvar resposta em arquivo com nome específico
curl -o meu_arquivo.json https://api.github.com

# Salvar resposta com o nome original do servidor
curl -O https://exemplo.com/arquivo.pdf

O parâmetro -o permite definir o nome do arquivo de saída, enquanto -O mantém o nome original fornecido pelo servidor.

3. Requisições básicas com wget

O wget tem comportamento diferente: por padrão, ele salva o conteúdo em arquivo:

# Download simples (salva como index.html ou nome do arquivo)
wget https://exemplo.com

# Especificar diretório de saída
wget -P /tmp/downloads https://exemplo.com/arquivo.zip

# Renomear arquivo baixado
wget -O backup.zip https://exemplo.com/arquivo.zip

O wget é particularmente útil para downloads que exigem confiabilidade, pois tenta automaticamente retomar conexões interrompidas com -c:

# Retomar download interrompido
wget -c https://exemplo.com/grande_arquivo.iso

4. Cabeçalhos e métodos HTTP

Para trabalhar com APIs e serviços web, é essencial controlar métodos HTTP e cabeçalhos:

# Métodos HTTP com curl
curl -X GET https://api.exemplo.com/usuarios
curl -X POST https://api.exemplo.com/usuarios
curl -X PUT https://api.exemplo.com/usuarios/1
curl -X DELETE https://api.exemplo.com/usuarios/1

# Cabeçalhos personalizados com curl
curl -H "Content-Type: application/json" -H "X-Custom-Header: valor" https://api.exemplo.com

# Visualizar cabeçalhos de resposta
curl -I https://google.com

# Cabeçalhos com wget
wget --header="Accept: application/json" https://api.exemplo.com
wget --server-response https://exemplo.com

5. Envio de dados e formulários

O envio de dados é uma operação frequente em scripts de automação:

# Dados via query string (GET)
curl "https://api.exemplo.com/busca?q=linux&pagina=1"

# Dados POST com curl
curl -X POST -d "nome=Joao&email=joao@email.com" https://api.exemplo.com/usuarios

# Dados POST em formato JSON
curl -X POST -H "Content-Type: application/json" -d '{"nome":"Joao","email":"joao@email.com"}' https://api.exemplo.com/usuarios

# Upload de arquivo com curl
curl -F "foto=@/caminho/imagem.jpg" https://api.exemplo.com/upload

# POST com wget
wget --post-data="nome=Joao&email=joao@email.com" https://api.exemplo.com/usuarios

6. Autenticação e cookies

A autenticação é fundamental para acessar recursos protegidos:

# Autenticação básica HTTP
curl -u usuario:senha https://api.exemplo.com/protegido
wget --user=usuario --password=senha https://api.exemplo.com/protegido

# Token Bearer (JWT, OAuth)
curl -H "Authorization: Bearer SEU_TOKEN_AQUI" https://api.exemplo.com/dados

# Gerenciamento de cookies com curl
curl -c cookies.txt -b cookies.txt https://site.com/login

# Salvar e carregar cookies com wget
wget --save-cookies=cookies.txt --load-cookies=cookies.txt https://site.com/login

7. Opções avançadas e boas práticas

Para scripts robustos, é importante controlar tempo, velocidade e comportamento:

# Timeout e limite de velocidade
curl --max-time 30 --limit-rate 100K https://exemplo.com/arquivo.zip
wget --timeout=30 --limit-rate=100K https://exemplo.com/arquivo.zip

# Seguir redirecionamentos
curl -L https://exemplo.com/pagina-redirecionada
# wget segue redirecionamentos por padrão

# Download recursivo com wget
wget -r -l 2 --accept=pdf,doc https://exemplo.com/documentos/

# Verbosidade e debug
curl -v https://api.exemplo.com
wget --debug https://exemplo.com

O parâmetro -r ativa o download recursivo no wget, -l define a profundidade e --accept filtra tipos de arquivo.

8. Scripts práticos com curl e wget

Monitoramento de disponibilidade de sites

#!/bin/bash
URL="https://meusite.com"
HTTP_CODE=$(curl -o /dev/null -s -w "%{http_code}" $URL)

if [ $HTTP_CODE -eq 200 ]; then
    echo "Site online - Código: $HTTP_CODE"
else
    echo "ALERTA: Site retornou código $HTTP_CODE"
fi

Download automatizado de múltiplos arquivos

#!/bin/bash
ARQUIVOS=("documento1.pdf" "documento2.pdf" "documento3.pdf")
BASE_URL="https://exemplo.com/downloads"

for ARQ in "${ARQUIVOS[@]}"; do
    echo "Baixando $ARQ..."
    wget -c "$BASE_URL/$ARQ" || echo "Falha ao baixar $ARQ"
done

Integração com API REST

#!/bin/bash
API_URL="https://api.github.com"
TOKEN="seu_token_github"

# Listar repositórios do usuário
curl -s -H "Authorization: token $TOKEN" "$API_URL/user/repos" | \
    jq '.[].name'

# Criar issue via POST
curl -s -X POST \
    -H "Authorization: token $TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"title":"Bug encontrado","body":"Descrição do bug"}' \
    "$API_URL/repos/usuario/repo/issues"

Referências