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)
endInspecionando 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"]) endTempos 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)
endVerificaçã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
- Fundamentos de TCP
- Construindo um cliente
- Construindo um servidor
- Solicitações HTTP