Conceitos Básicos de curl e wget: Comunicação HTTP pela Linha de Comando

Conceitos Básicos de curl e wget: Comunicação HTTP pela Linha de Comando

O que você vai conseguir fazer

  • Escolher entre `curl` e `wget` conforme o objetivo da tarefa
  • Conferir onde o arquivo baixado cai e se ele vai sobrescrever algo
  • Seguir redirecionamentos, inspecionar headers e enviar JSON por POST copiando os exemplos

Pré-requisitos (leia estes primeiro)

O Que Você Vai Aprender

  • A diferença de função entre curl e wget
  • Onde o arquivo baixado é criado, antes de baixar
  • Como evitar sobrescrever um arquivo que você ainda precisa
  • Como inspecionar headers e chamar APIs com comandos prontos para copiar

As palavras usadas aqui (organizadas antes)

  • Download: copiar para a sua máquina dados que estão em outra máquina da rede.
  • Redirecionamento: um aviso do servidor dizendo "esta página mudou de lugar". Não é o > de redirecionamento do shellUm programa interativo que interpreta os comandos digitados e os executa.. Uma palavra, dois sentidos.
  • Header: uma etiqueta enviada junto com o corpo da resposta. Ela diz o tipo e o tamanho do conteúdo.
  • Código de status: um número de três dígitos com o resultado. 200 é sucesso, 404 é não encontrado.
  • API: uma porta que os programas usam para conversar entre si. A resposta costuma ser JSON, e não HTML.

Resumo Rápido

  • Download único 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 típico
  • curl geralmente já vem instalado. Instale wget via sudo apt install wget
  • Focamos em HTTP/HTTPS (curl também suporta ftp, sftp, smtp, etc.)

1. curl vs wget: Funções Diferentes

Conclusão: wget é um downloader que salva por padrão; curl é um cliente HTTP que imprime.

Lina: Senpai, tanto curl quanto wget "buscam dados de uma URL," certo? Eu sempre fico em dúvida sobre qual usar.
Veterano Linny: Ótima pergunta. Eles têm objetivos de design diferentes. Em uma frase: wget é um downloader, curl é um cliente HTTP multiuso.
Lina: Downloader e cliente?
Veterano Linny: Downloader é a ferramenta dedicada a buscar arquivos. Cliente é o lado que conversa com um servidor.
Lina: Entendi. Então o curl cobre mais coisas.
Veterano Linny: Isso. O padrão do wget é "dada uma URL, salvar o arquivo." O do curl é "dada uma URL, imprimir a resposta." Essa diferença guia todas as outras escolhas.

Visão geral

Aspecto curl wget
Comportamento padrão Imprime no stdout Salva como arquivo
Métodos HTTP GET/POST/PUT/DELETE/... Principalmente GET
Seguir redirecionamentos Precisa da flag -L Automático
Download recursivo Fraco Forte (-r)
Retomar -C - -c
Melhor para APIs, depuração, POST Espelhar sites, downloads grandes

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

2. Básico do curl: Imprimir Antes de Salvar

Conclusão: curl imprime na tela por padrão; 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: Nossa, o HTML inteiro inundou a minha tela.
Veterano Linny: Esse é o comportamento padrão do curl — despejar tudo no stdout. Para salvar em arquivo, adicione -o (nome escolhido) ou -O (nome do arquivo da URL).

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

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

-o vem de output. O o minúsculo recebe como argumento o nome que você quiser.

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

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

O O maiúsculo reaproveita o nome no fim da URL. Aqui, sample.tar.gz.

Confundir -o com -O termina em lágrimas

  • -O exige que a URL termine em um nome de arquivo real
  • curl -O https://example.com/ (barra no fim) falha, pois não há nome para usar
  • Na dúvida, use -o nome e seja explícito

2-4. Onde o Arquivo Cai? Ele Sobrescreve?

Antes de qualquer download, confira duas coisas: onde o arquivo é criado e o que acontece se o nome já existir.

Local de gravação e sobrescrita, antes de tudo

  • O arquivo cai no diretórioUm local que organiza arquivos. É a mesma ideia da "pasta" do Windows ou macOS. em que você está agora. Confira com pwd
  • curl -O e curl -o sobrescrevem um arquivo de mesmo nome sem perguntar
  • Diferente de um gerenciador gráfico, não aparece nenhuma caixa de confirmação. O conteúdo antigo se perde
  • Para bloquear a sobrescrita, use curl --no-clobber -O URL. Se o nome já existir, o curl não faz nada
  • O wget não sobrescreve por padrão. Ele salva sample.tar.gz.1, acrescentando um número
  • O curl e o wget não rodam no terminal virtual deste site. Execute-os no terminal da sua máquina
  • Pratique dentro do diretório vazio criado em "10. Mini Exercícios". Lá nada do que você já tinha pode quebrar
Lina: Senpai, eu baixei um arquivo de configuração com curl -O e editei. Depois rodei o mesmo comando de novo. As minhas edições sumiram.
Veterano Linny: Isso é sobrescrita. O curl nunca pergunta "já existe um arquivo com esse nome, tudo bem?". Ele simplesmente substitui.
Lina: Nenhuma confirmação? E nada vai para a lixeira...
Veterano Linny: Nada. Por isso rode ls antes de baixar para ver se o nome já está ocupado. Se quiser outro nome, escolha você mesma com -o. Esses dois hábitos evitam quase todos os acidentes.
Lina: Entendi. "Rodar ls antes de baixar" teria me salvado.
# Antes de baixar, confira onde voce esta e o que ja existe
$ pwd
$ ls sample.tar.gz

# Quando a sobrescrita preocupa, escolha o nome voce mesma
$ curl -o sample-20260605.tar.gz https://example.com/sample.tar.gz

2-5. Mostrar Progresso do Download

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

--progress-bar mostra uma barra de progresso simples. Transferências longas ficam fáceis de acompanhar.

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

Conclusão: curl não segue redirecionamentos por padrão; adicione -L para chegar na página final.

Lina: Senpai, rodei curl em https://github.com/torvalds/linux e a resposta parece errada.
Veterano Linny: Clássico. URLs do GitHub e URLs curtas costumam envolver um redirecionamento HTTP.
Lina: Redirecionamento — aquele aviso de "a página mudou de lugar"?
Veterano Linny: Isso. Por padrão o curl não persegue esse aviso. Você recebe o aviso, e não a página indicada. Com -L, ele passa a seguir.

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 vem de Location. Location é o header HTTP que carrega o novo endereço.

Memorize o padrão

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

-LO é -L e -O unidos. Opções de uma letra podem ser combinadas assim. Escrever -L -O tem o mesmo efeito.

Conclusão: -I busca apenas headers sem o corpo; o código de status revela o estado.

Quer saber "este link está vivo?" 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: Então HTTP/2 200 significa "sucesso", certo?
Veterano Linny: Exatamente. O número é o código de status HTTP. Memorize esses e você cobre 90% dos casos reais.

Tabela rápida de status HTTP

Código Significado Exemplos
2xx Sucesso 200 OK, 204 No Content
3xx Redirecionamento 301 (permanente), 302 (temp)
4xx Erro do cliente 404 (não encontrado), 401
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

-ILs é -I, -L e -s combinados em um. -L segue redirecionamentos, -s silencia progresso e erros, -I mostra apenas headers. Cada salto acrescenta a sua linha location:, e a última é o destino final.

5. POST e JSON: Comunicando-se com APIs

Conclusão: Acesse APIs com três flags: -X para o método, -H para headers, -d para o corpo.

Lina: Quero chamar uma API REST com curl. Como envio JSON?
Veterano Linny: Testar APIs é onde o curl brilha. Use -X para o método HTTP, -H para headers e -d para o corpo. Lembre dessas três flags e pronto.

5-1. GET Com Parâmetros de Query

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

Sempre coloque entre aspasEnvolver um texto entre aspas (' ou ") para que seja tratado como um único valor, por exemplo um que tenha espaços. as URLs com ? e &. Sem aspas, o shell lê & como execução em segundo plano.

5-2. POST JSON

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

A combinação de três flags

  • -X POST: o método HTTP. O -d já faz o curl enviar um POST, então normalmente você não precisa escrever isso
  • -H "Content-Type: application/json": declara "isto é JSON"
  • -d '...': o corpo da requisição. Use aspas simples para não precisar escapar as " internas

5-3. Autenticação com Bearer Token

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

Mantenha tokens fora do histórico 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 visíveis em history ou ps são um incidente esperando para acontecer. Use variáveis de ambiente ou ~/.netrc.

5-4. Autenticação Básica

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

-u aceita user:pass. Use somente com HTTPS.

6. A Força do wget: Downloads Confiáveis

Conclusão: wget salva por padrão e segue redirecionamentos; -O renomeia, -c retoma um download.

6-1. Básico: Salvar como Arquivo

$ wget https://example.com/sample.tar.gz
Lina: O wget salva o arquivo sem nenhuma flag. Que fácil.
Veterano Linny: Isso — o wget salva por padrão. E, diferente do curl, segue redirecionamentos sozinho. Para downloads simples, é mais difícil errar com wget.

O wget não sobrescreve por conta própria

Se o nome já estiver ocupado, o wget salva sample.tar.gz.1, ou seja, o mesmo nome com um número. A exceção é -O nome: essa forma sobrescreve o nome informado. Guarde essa diferença.

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

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

-O significa o oposto em curl e wget

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

Todo mundo que usa os dois cai nessa pelo menos uma vez.

6-3. Retomar um Download Interrompido: -c

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

-c vem de continue. Se a conexão caiu no meio, ele continua de onde parou em vez de recomeçar.

6-4. Tentativas e Timeouts

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

Sobrevive a redes instáveis tentando de novo.

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

Conclusão: 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: percorre os links recursivamente
  • -l 2: limita a profundidade a 2 níveis
  • -np: não sobe para diretórios pai

8. Armadilhas de Encoding e Fim de Linha

Conclusão: curl e wget entregam bytes brutos; corrija encoding com iconv e CRLF com tr.

Lina: A página que busquei está cheia de símbolos ilegíveis no lugar do texto.
Veterano Linny: É uma divergência de codificação. O navegador detecta a codificação e corrige para você. O curl e o wget entregam os bytes brutos. Para páginas que não são UTF-8, passe a saída pelo iconv.
Lina: As quebras de linha também parecem erradas.
Veterano Linny: Arquivos de servidores Windows costumam usar \r\n (CRLF). No Linux, remova 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

Aqui o > é o redirecionamento do shell. Ele também substitui o conteúdo do arquivo alvo sem perguntar. Não aponte para um nome que você ainda precisa.

9. Armadilhas Comuns para Iniciantes

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

9-1. curl URL Não Salvou Nada

Causa: o curl imprime no stdout por padrão. 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 Página de Redirecionamento em Vez do Conteúdo

Causa: esqueceu o -L.

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

9-3. Parte da Query e Ignorada, ou Aparece um Erro Estranho

Causa: o shell leu & como o operador de execução em segundo plano. Tudo antes do & vai para o curl; o resto vira outro comando.

  • Com &page=2 (existe um =): nenhum erro aparece. O &page=2 é descartado em silêncio e só o resultado muda. Este é o caso mais difícil de perceber
  • Com &page (sem =): aparece page: command not found
# 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 autoassinado, 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 desativa a verificação, abrindo espaço para ataques de intermediário. Em produção, conserte a cadeia de certificados.

9-5. Ambiente de Proxy Não 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 Exercícios

Conclusão: Use httpbin.org para praticar verificação de status, POST JSON e seguir redirecionamentos.

Lina: A teoria entrou! Quero testar no terminal.
Veterano Linny: Três exercícios. https://httpbin.org é um ambiente seguro para testes HTTP — pode acessar à vontade.

Crie um diretório de prática vazio e trabalhe dentro dele. Assim você nunca sobrescreve um arquivo que já tinha.

# Prepare um diretorio de pratica e entre nele
$ mkdir -p ~/curl-practice && cd ~/curl-practice
  • ~ representa o seu diretório home, o espaço que pertence a você
  • && significa "execute o lado direito só se o esquerdo der certo". Duas linhas separadas fazem o mesmo

Exercício 1: Verifique o código de status HTTP e o content-type de https://httpbin.org/get.

Ver Dica 1 (Direção)

Você não precisa do corpo. Existe uma flag que busca apenas as etiquetas.

Ver Dica 2 (Nome do comando)

O comando é curl. A flag é a única letra que apareceu em "4. Inspecionar Apenas Headers".

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

O 200 inicial indica sucesso. content-type: application/json diz que a resposta é JSON.

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

Ver Dica 1 (Direção)

Você precisa de três coisas: o método, a declaração "isto é JSON" e o corpo.

Ver Dica 2 (Nome do comando)

O comando é curl. As flags são as três usadas em "5-2. POST JSON".

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

Você verá "json": {"hello": "world"} devolvido na resposta.

Exercício 3: Siga a cadeia de redirecionamentos em https://httpbin.org/redirect/3 e busque a página final.

Ver Dica 1 (Direção)

O curl ignora o aviso de "mudou de lugar" a menos que você mande persegui-lo.

Ver Dica 2 (Nome do comando)

O comando é curl. A flag é a única letra de "3. A Armadilha #1 para Iniciantes" — a inicial de Location.

Ver Resposta
$ curl -L https://httpbin.org/redirect/3

Depois de três saltos ele chega em /get e retorna essa resposta.

11. Templates para Copiar e Colar

Conclusão: Templates de curl e wget para copiar e colar para salvar, redirecionamentos, headers e POST.

Templates de curl

# Imprimir na tela (depuracao)
curl URL

# Salvar (usando nome do arquivo da URL; sobrescreve o mesmo nome)
curl -O URL

# Salvar (nome personalizado; sobrescreve o mesmo nome)
curl -o name 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 de wget

# Download basico (acrescenta um numero se o nome existir)
wget URL

# Salvar com nome personalizado (sobrescreve esse nome)
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/

Retomando

Conclusão: Escolha pelo objetivo, olhe antes de baixar e use -L em sites externos.

Lina: Vou resumir. Se é só pegar um arquivo, wget. Se é olhar uma API ou headers, curl.
Veterano Linny: Exato. Na dúvida, pergunte: "estou salvando isto ou lendo isto?"
Lina: E rodar pwd e ls antes de baixar, porque curl -O sobrescreve sem perguntar.
Veterano Linny: Perfeito. Mais o -L quando o curl acessa um site externo. Leve esses três pontos.

Resumo em Três Linhas

Conclusão: Escolha a ferramenta pelo objetivo, confira o destino e a sobrescrita, e use -L em sites externos.

  1. Use curl para APIs e headers. Use wget quando só quer o arquivo
  2. Rode pwd e ls antes. curl -O e curl -o sobrescrevem o mesmo nome sem perguntar
  3. Adicione -L quando o curl acessar um site externo, para ele seguir o redirecionamento

Resumo: O Que Ler em Seguida