0Pricing
Lua Academy · Aula

Solicitações HTTP

Busque recursos da web.

Solicitações HTTP é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.

O Módulo socket.http

O LuaSocket inclui um cliente HTTP de alto nível em socket.http. Ele se baseia em TCP bruto, mas cuida da formatação das requisições, dos cabeçalhos e da decodificação em blocos para você.

Ele fala HTTP/1.1 sobre TCP simples. Para HTTPS, você precisa do módulo complementar ssl.https do LuaSec.

local http = require("socket.http")
print(http.PORT)

Um GET Simples

A forma mais simples recebe uma URL e retorna o corpo, o código de status, os cabeçalhos da resposta e a linha de status.

Um código de status 200 significa sucesso. Um corpo nil indica uma falha no nível de transporte, não um erro HTTP.

local http = require("socket.http")
local body, code, headers = http.request("http://example.com/")
print(code, #body)

Lendo o Status

Verifique sempre o code numérico antes de confiar no corpo. Um 404 ainda retorna um corpo, que é a página de erro; portanto, a chamada foi bem-sucedida no nível TCP.

O quarto valor retornado é a string da linha de status, como "HTTP/1.1 200 OK", útil para o registro.

local body, code, headers, status = http.request(url)
if code == 200 then
  process(body)
else
  print("unexpected:", status)
end

Inspecionando Cabeçalhos

A tabela headers retornada tem chaves em minúsculas, portanto você lê headers["content-type"] independentemente de como o servidor escreveu as letras.

Os campos comuns incluem content-length, content-type e location para redirecionamentos.

local body, code, headers = http.request(url)
print(headers["content-type"])
print(headers["content-length"])

A Forma Genérica de Requisição

Passar uma tabela para http.request oferece controle completo: método, cabeçalhos personalizados, fonte do corpo da requisição e destino da resposta.

Essa forma retorna 1, não o corpo, além do código, dos cabeçalhos e do status. Você coleta o corpo por conta própria usando o destino.

local http = require("socket.http")
local ltn12 = require("ltn12")
local chunks = {}
http.request{
  url = "http://example.com/",
  sink = ltn12.sink.table(chunks)
}

Enviando um POST

Para POST, defina method = "POST", forneça uma source com o corpo e defina content-length. O auxiliar ltn12.source.string envolve uma string Lua como uma fonte.

Defina content-type de acordo com o conteúdo enviado, como application/json.

local body = "{\"name\":\"Lua\"}"
http.request{
  url = url,
  method = "POST",
  source = ltn12.source.string(body),
  headers = {
    ["content-type"] = "application/json",
    ["content-length"] = tostring(#body)
  }
}

Coletando o Corpo com ltn12

O LuaSocket transmite dados por meio de filtros ltn12. Um destino consome blocos; ltn12.sink.table(t) os acrescenta a uma tabela que depois você concatena com table.concat.

Esse modelo de transmissão mantém baixo o uso de memória em transferências grandes, em vez de armazenar tudo de uma só vez.

local ltn12 = require("ltn12")
local t = {}
http.request{ url = url, sink = ltn12.sink.table(t) }
local full = table.concat(t)

Cabeçalhos Personalizados de Requisição

Adicione autenticação, agentes de usuário ou cookies por meio da tabela headers. As chaves devem estar em minúsculas, conforme o formato esperado pelo LuaSocket.

Por exemplo, envie um token de portador ou um user-agent personalizado para que o servidor identifique seu cliente corretamente.

http.request{
  url = url,
  headers = {
    ["authorization"] = "Bearer " .. token,
    ["user-agent"] = "lua-client/1.0"
  }
}

Seguindo Redirecionamentos

Por padrão, socket.http segue redirecionamentos automaticamente para GET. Você pode desativar isso com redirect = false na tabela da requisição para inspecionar a resposta 3xx por conta própria.

Quando o acompanhamento está desativado, leia headers["location"] para encontrar a próxima URL.

local body, code, headers = http.request{
  url = url,
  redirect = false
}
if code == 301 then print("moved to", headers["location"]) end

Tempos Limite e HTTPS

Defina um tempo limite global para chamadas HTTP com http.TIMEOUT = 10, pois, caso contrário, transferências travadas bloquearão o programa indefinidamente.

Como socket.http usa apenas texto simples, use require("ssl.https") do LuaSec para URLs https://; sua interface é equivalente à de socket.http.

local http = require("socket.http")
http.TIMEOUT = 10
-- for TLS:
local https = require("ssl.https")
local body, code = https.request("https://example.com/")

Tratamento de Erros

Diferencie duas camadas de falha. Uma falha de transporte retorna nil e uma string de erro, como "connection refused" ou "timeout".

Uma falha da aplicação retorna um corpo com um código 4xx ou 5xx. Um código robusto verifica primeiro o caso nil e depois decide com base no código de status.

local body, code = http.request(url)
if not body then
  print("transport error:", code)
elseif code >= 400 then
  print("http error:", code)
end

Verificação rápida

Relembre o que a forma simples de URL de http.request retorna.

Recapitulação

Você aprendeu a usar o módulo socket.http: solicitações GET simples que retornam corpo, código e cabeçalhos; a forma genérica de tabela com destinos e fontes ltn12; corpos POST; cabeçalhos personalizados; redirecionamentos; e tempos limite.

Você também separou erros de transporte (nil) de erros de status HTTP e viu que HTTPS precisa do ssl.https do LuaSec. Isso conclui a jornada de redes, do TCP bruto ao HTTP.

Perguntas Frequentes

A aula “Solicitações HTTP” é grátis?

Sim — o texto completo de “Solicitações HTTP” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.

O que vou aprender em “Solicitações HTTP”?

Busque recursos da web. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Lua Academy?

Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Solicitações HTTP”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Lua Academy?

Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Fundamentos de TCP
  2. Construindo um cliente
  3. Construindo um servidor
  4. Solicitações HTTP
← Voltar para Lua Academy