Conceitos Basicos de curl e wget: Comunicacao HTTP pela Linha de Comando

Conceitos Basicos de curl e wget: Comunicacao HTTP pela Linha de Comando

O Que Voce Vai Aprender

  • A diferenca de funcao entre curl e wget para voce parar de adivinhar qual usar
  • Comandos essenciais para baixar arquivos, verificar headers e chamar APIs
  • Por que iniciantes encontram "nada foi salvo," "redirecionamentos nao funcionam," e "caracteres estranhos" — e como corrigir cada um
  • Templates para copiar e colar para inspecionar codigos de status HTTP e enviar JSON

Resumo Rapido

  • Download unico de arquivo → wget URL
  • Acessar uma API, inspecionar headers ou POST → curl URL
  • Quer seguir redirecionamentos → curl -L URL
  • Download foi interrompido → wget -c URL

Ambiente

  • SO: Ubuntu / Linux tipico
  • curl geralmente ja vem instalado. Instale wget via sudo apt install wget
  • Focamos em HTTP/HTTPS (curl tambem suporta ftp, sftp, smtp, etc.)

1. curl vs wget: Funcoes Diferentes

Conclusao: wget e um downloader que salva por padrao; curl e um cliente HTTP que imprime.

Lina: Senpai, tanto curl quanto wget "buscam dados de uma URL," certo? Eu sempre fico em duvida sobre qual usar...
Veterano Linny: Otima pergunta. Eles na verdade tem objetivos de design diferentes, e uma vez que voce sabe disso, escolher um se torna facil. Em uma frase: wget e um downloader, curl e um cliente HTTP multiuso.
Lina: Downloader vs cliente...?
Veterano Linny: A acao padrao do wget e "dada uma URL, salvar o arquivo." A do curl e "dada uma URL, imprimir a resposta na tela." Essa unica diferenca se propaga para todas as outras escolhas.

Visao geral

Aspecto curl wget
Comportamento padrao Imprime no stdout Salva como arquivo
Metodos HTTP GET/POST/PUT/DELETE/... Principalmente GET
Seguir redirecionamentos Precisa da flag -L Automatico
Download recursivo Fraco Forte (-r)
Retomar -C - -c
Melhor para APIs, depuracao, POST Espelhar sites, downloads grandes

Regra pratica: APIs, headers ou POST envolvidos → curl. Apenas baixar um arquivo → wget.

2. Basico do curl: Imprimir Antes de Salvar

Conclusao: curl imprime na tela por padrao; adicione -o nome ou -O para salvar em arquivo.

2-1. Acessar uma URL e Imprimir a Resposta

$ curl https://example.com
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
...
Lina: Uau, o HTML inteiro inundou minha tela.
Veterano Linny: Esse e o comportamento padrao do curl — despejar tudo no stdout. Para salvar em arquivo, adicione -o (especificar nome) ou -O (usar o nome do arquivo da URL).

2-2. Salvar Com um Nome Personalizado: -o

$ curl -o page.html https://example.com

-o significa output. o minusculo recebe um nome de arquivo como argumento.

2-3. Salvar Usando o Nome do Arquivo da URL: -O

$ curl -O https://example.com/sample.tar.gz

O maiusculo salva usando o nome do arquivo final da URL (sample.tar.gz neste caso).

Confundir -o e -O acaba em lagrimas

  • -O requer que a URL termine com um nome de arquivo real
  • curl -O https://example.com/ (barra final) falha — nao ha nome de arquivo para usar
  • Na duvida, use -o nome e seja explicito

2-4. Mostrar Progresso do Download

$ curl -O --progress-bar https://example.com/big.iso

--progress-bar mostra uma barra de progresso limpa — util para transferencias longas.

3. A Armadilha #1 para Iniciantes: Redirecionamentos e -L

Conclusao: curl nao segue redirecionamentos por padrao; adicione -L para chegar na pagina final.

Lina: Senpai, eu executei curl em https://github.com/torvalds/linux e a resposta parece errada...
Veterano Linny: Classico. URLs do GitHub e URLs curtas frequentemente envolvem redirecionamentos HTTP, e o curl nao os segue por padrao. Entao em vez da pagina redirecionada, voce recebe o placeholder "moved here".
Lina: Ele nao segue? O wget seguiu, no entanto.
Veterano Linny: Correto — essa e uma diferenca chave. Com curl voce precisa adicionar -L explicitamente para faze-lo seguir redirecionamentos.

3-1. Seguir Redirecionamentos Com -L

# RUIM: apenas o placeholder de redirecionamento e retornado
$ curl https://github.com/torvalds/linux

# BOM: buscar o destino final
$ curl -L https://github.com/torvalds/linux

-L significa Location (o header HTTP Location).

Memorize o padrao

  • Ao acessar sites externos com curl, sempre adicione -L para evitar surpresas
  • Downloads de arquivos frequentemente requerem -L tambem (GitHub Releases, redirecionamentos S3, etc.)
# Padrao seguro padrão
$ curl -LO https://github.com/some/repo/releases/download/v1.0/binary.tar.gz

Conclusao: -I busca apenas headers sem o corpo; o codigo de status revela o estado.

Quer verificar "este link esta ativo?" ou "para onde este redirecionamento leva?" sem baixar o corpo? Use -I.

$ curl -I https://example.com
HTTP/2 200
content-type: text/html; charset=UTF-8
content-length: 1256
date: Sun, 26 May 2026 09:00:00 GMT
server: ECS
Lina: Entao HTTP/2 200 significa "sucesso," certo?
Veterano Linny: Exatamente. O numero e o codigo de status HTTP. Memorize estes e voce cobre 90% dos casos do mundo real.

Tabela de referencia de status HTTP

Codigo Significado Exemplos
2xx Sucesso 200 OK, 204 No Content
3xx Redirecionamento 301 (permanente), 302 (temp)
4xx Erro do cliente 404 (nao encontrado), 401/403
5xx Erro do servidor 500 (bug), 503 (sobrecarga)

4-1. Rastrear Para Onde um Redirecionamento Leva

$ curl -ILs https://bit.ly/3xxxxx | grep -i location

-L segue redirecionamentos, -s silencia o progresso, -I mostra apenas headers. As linhas location: revelam cada salto.

5. POST e JSON: Comunicando-se com APIs

Conclusao: Acesse APIs com tres flags: -X para o metodo, -H para headers, -d para o corpo.

Lina: Quero chamar uma API REST com curl. Como eu envio JSON?
Veterano Linny: Teste de API e onde o curl brilha. Use -X para o metodo HTTP, -H para headers e -d para o corpo. Lembre dessas tres flags e pronto.

5-1. GET Com Parametros de Query

$ curl "https://api.example.com/users?id=42"

Sempre coloque URLs contendo ? e & entre aspas — caso contrario, o shell interpreta & como execucao em background.

5-2. POST JSON

$ curl -X POST https://api.example.com/users \
    -H "Content-Type: application/json" \
    -d '{"name":"lina","role":"beginner"}'

O combo de tres flags

  • -X POST: metodo HTTP explicito (opcional com -d, mas explicito e mais seguro)
  • -H "Content-Type: application/json": declarar "isto e JSON"
  • -d '...': o corpo da requisicao. Use aspas simples para que as " internas nao precisem de escape

5-3. Autenticacao com Bearer Token

$ curl https://api.example.com/me \
    -H "Authorization: Bearer YOUR_TOKEN_HERE"

Mantenha tokens fora do historico do shell

# RUIM: visivel em `history` e `ps`
$ curl -H "Authorization: Bearer abc123..." ...

# BOM: passe via variavel de ambiente
$ export API_TOKEN=abc123...
$ curl -H "Authorization: Bearer $API_TOKEN" ...

Tokens visiveis em history ou ps sao um incidente esperando para acontecer. Use variaveis de ambiente ou ~/.netrc.

5-4. Autenticacao Basica

$ curl -u username:password https://example.com/private

-u aceita user:pass. Apenas HTTPS.

6. A Forca do wget: Downloads Confiaveis

Conclusao: wget salva por padrao e segue redirecionamentos; -O renomeia, -c retoma um download.

6-1. Basico: Salvar como Arquivo

$ wget https://example.com/sample.tar.gz
Lina: wget salva o arquivo sem nenhuma flag. Facil.
Veterano Linny: Isso — wget salva por padrao. E diferente do curl, ele segue redirecionamentos automaticamente. Para downloads simples, wget e mais dificil de errar.

6-2. Salvar Com um Nome Personalizado: -O

$ wget -O custom.tar.gz https://example.com/sample.tar.gz

-O tem significado oposto no curl e wget

  • -O do curl: salvar usando o nome do arquivo da URL
  • -O do wget: especificar o nome do arquivo (equivalente ao -o do curl)

Todo mundo que usa ambos cai nessa pelo menos uma vez.

6-3. Retomar um Download Interrompido: -c

$ wget -c https://example.com/big.iso

-c significa continue. Se sua conexao caiu no meio, isso retoma de onde parou em vez de reiniciar.

6-4. Tentativas e Timeouts

$ wget --tries=5 --timeout=30 https://example.com/file.zip

Sobrevive a redes instáveis com novas tentativas.

7. Download Recursivo wget -r (Use com Cuidado)

Conclusao: wget -r percorre links recursivamente; sempre limite a profundidade com -l e o escopo com -np.

$ wget -r -l 2 -np https://example.com/docs/
  • -r: percorrer links recursivamente
  • -l 2: limitar profundidade a 2 niveis
  • -np: nao subir para diretorios pais

8. Armadilhas de Encoding e Fim de Linha

Conclusao: curl e wget entregam bytes brutos; corrija encoding com iconv e CRLF com tr.

Lina: O HTML que eu baixei esta cheio de &lt; e caracteres estranhos. Nao consigo ler.
Veterano Linny: Navegadores decodificam automaticamente, mas curl/wget entregam os bytes brutos. Para paginas que nao sao UTF-8, passe a saida pelo iconv. Para dados estruturados como JSON, use um parser como jq.
Lina: Alem disso, as quebras de linha as vezes parecem estranhas...
Veterano Linny: Arquivos de servidores Windows frequentemente usam \r\n (CRLF). No Linux, remova-os com dos2unix ou tr -d '\r'.
# Converter Shift_JIS para UTF-8 ao salvar
$ curl -s https://example.com/sjis.html | iconv -f SHIFT_JIS -t UTF-8 > page.html

# Converter CRLF para LF
$ curl -s https://windows-server.example/data.csv | tr -d '\r' > data.csv

9. Armadilhas Comuns para Iniciantes

Conclusao: Armadilhas comuns: esquecer -O/-o para salvar, esquecer -L e & sem aspas nas URLs.

9-1. curl URL Nao Salvou Nada

Causa: curl imprime no stdout por padrao. Para salvar, use -O ou -o.

$ curl -O https://example.com/file.zip
$ curl -o my.zip https://example.com/file.zip

9-2. Recebeu a Pagina de Redirecionamento em Vez do Conteudo

Causa: esqueceu -L.

$ curl -L https://github.com/...

9-3. Query String Causa bash: command not found

Causa: o shell interpretou & como o operador de execucao em background.

# RUIM
$ curl https://api.example.com/search?q=linux&page=2

# BOM
$ curl "https://api.example.com/search?q=linux&page=2"

9-4. Erro de Certificado SSL

Causa: certificado auto-assinado, certificado expirado, CA interna, etc.

# Com verificacao (recomendado)
$ curl https://internal.example.com

# Pular verificacao (apenas emergencias — nunca em producao)
$ curl -k https://internal.example.com

-k desabilita a verificacao, abrindo porta para ataques man-in-the-middle. Para producao, corrija a cadeia de certificados.

9-5. Ambiente de Proxy Nao Consegue Conectar

$ export http_proxy=http://proxy.example.com:8080
$ export https_proxy=http://proxy.example.com:8080
$ curl https://example.com

Em ambientes corporativos, configure http_proxy / https_proxy.

10. Mini Exercicios

Conclusao: Use httpbin.org para praticar verificacao de status, POST JSON e seguir redirecionamentos.

Lina: Teoria absorvida! Deixa eu tentar no terminal.
Veterano Linny: Tres exercicios. https://httpbin.org e um sandbox seguro para testes HTTP — acesse livremente.

Exercicio 1: Verifique o codigo de status HTTP e o content-type de https://httpbin.org/get.

Mostrar dica

Ha uma flag que busca apenas headers.

Mostrar resposta
$ curl -I https://httpbin.org/get
HTTP/2 200
date: ...
content-type: application/json
...

Exercicio 2: Envie o JSON {"hello":"world"} via POST para https://httpbin.org/post.

Mostrar dica

O combo de tres flags -X POST / -H / -d.

Mostrar resposta
$ curl -X POST https://httpbin.org/post \
    -H "Content-Type: application/json" \
    -d '{"hello":"world"}'

Voce vera "json": {"hello": "world"} ecoado de volta na resposta.

Exercicio 3: Siga a cadeia de redirecionamentos em https://httpbin.org/redirect/3 e busque a pagina final.

Mostrar dica

Voce precisa da flag que segue redirecionamentos.

Mostrar resposta
$ curl -L https://httpbin.org/redirect/3

Apos tres saltos ele chega em /get e retorna essa resposta.

11. Templates para Copiar e Colar

Conclusao: Templates de curl e wget para copiar e colar para salvar, redirecionamentos, headers e POST.

Templates do curl

# Imprimir na tela (depuracao)
curl URL

# Salvar (usando nome do arquivo da URL)
curl -O URL

# Salvar (nome personalizado)
curl -o nome URL

# Seguir redirecionamentos e salvar (GitHub Releases, etc.)
curl -LO URL

# Apenas headers
curl -I URL

# Obter apenas o codigo de status
curl -s -o /dev/null -w "%{http_code}\n" URL

# POST JSON
curl -X POST URL \
    -H "Content-Type: application/json" \
    -d '{"key":"value"}'

# Bearer token
curl URL -H "Authorization: Bearer $API_TOKEN"

# Autenticacao basica
curl -u user:pass URL

# Com barra de progresso
curl -O --progress-bar URL

Templates do wget

# Download basico
wget URL

# Salvar com nome personalizado
wget -O custom.name URL

# Retomar um download interrompido
wget -c URL

# Tentativas e timeout
wget --tries=5 --timeout=30 URL

# Download silencioso (log minimo)
wget -q URL

# Recursivo (com boas maneiras)
wget -r -l 2 -np --wait=2 https://example.com/docs/

Resumo: O Que Ler em Seguida