HTTP 请求
获取 Web 资源。
HTTP 请求 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
socket.http 模块
LuaSocket 在 socket.http 中提供了高级 HTTP 客户端。它基于原始 TCP 构建,但会为您处理请求格式、标头和分块解码。
它通过普通 TCP 传输 HTTP/1.1。对于 HTTPS,您需要 LuaSec 提供的配套 ssl.https 模块。
local http = require("socket.http")
print(http.PORT)简单的 GET
最简单的形式接收一个 URL,并返回正文、状态码、响应标头和状态行。
状态码为 200 表示成功。任何 nil 正文都表示传输层失败,而不是 HTTP 错误。
local http = require("socket.http")
local body, code, headers = http.request("http://example.com/")
print(code, #body)读取状态
在信任正文之前,始终先检查数值型 code。404 仍然会返回正文(错误页面),因此调用在 TCP 层面是成功的。
第四个返回值是状态行字符串,例如 "HTTP/1.1 200 OK",可用于记录日志。
local body, code, headers, status = http.request(url)
if code == 200 then
process(body)
else
print("unexpected:", status)
end检查标头
返回的 headers table 中的键均为小写,因此无论服务器使用何种大小写,您都可以读取 headers["content-type"]。
常见字段包括 content-length、content-type,以及用于重定向的 location。
local body, code, headers = http.request(url)
print(headers["content-type"])
print(headers["content-length"])通用请求形式
将一个 table 传给 http.request 后,您就可以完全控制请求:方法、自定义标头、请求正文源以及响应接收器。
这种形式返回 1(而不是正文),以及状态码、标头和状态。您需要通过接收器自行收集正文。
local http = require("socket.http")
local ltn12 = require("ltn12")
local chunks = {}
http.request{
url = "http://example.com/",
sink = ltn12.sink.table(chunks)
}发送 POST
对于 POST,请设置 method = "POST",提供包含正文的 source,并设置 content-length。ltn12.source.string 辅助函数可以将 Lua 字符串封装为源。
将 content-type 设置为与有效载荷匹配的类型,例如 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)
}
}使用 ltn12 收集正文
LuaSocket 会通过 ltn12 过滤器以流的方式传输数据。接收器会消耗数据块;ltn12.sink.table(t) 会将它们追加到一个 table 中,然后您可以使用 table.concat 将其连接起来。
对于大型下载,这种流式模型无需一次性缓存全部内容,因此可以减少内存占用。
local ltn12 = require("ltn12")
local t = {}
http.request{ url = url, sink = ltn12.sink.table(t) }
local full = table.concat(t)自定义请求标头
通过 headers table 添加身份验证信息、用户代理或网站标识。键应为小写,以符合 LuaSocket 的要求。
例如,发送承载令牌或自定义 user-agent,让服务器正确识别您的客户端。
http.request{
url = url,
headers = {
["authorization"] = "Bearer " .. token,
["user-agent"] = "lua-client/1.0"
}
}跟随重定向
默认情况下,socket.http 会对 GET 自动跟随重定向。您可以在请求 table 中使用 redirect = false 禁用此功能,以便自行检查 3xx 响应。
关闭自动跟随后,请读取 headers["location"] 来查找下一个 URL。
local body, code, headers = http.request{
url = url,
redirect = false
}
if code == 301 then print("moved to", headers["location"]) end超时与 HTTPS
使用 http.TIMEOUT = 10 为 HTTP 调用设置全局超时,因为否则挂起的下载会无限期地阻塞程序。
由于 socket.http 仅支持明文传输,对于 https:// URL,请使用 LuaSec 提供的 require("ssl.https");其 API 与 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/")错误处理
请区分两个失败层级。传输失败会返回 nil 和错误字符串,例如 "connection refused" 或 "timeout"。
应用层失败会返回正文以及 4xx 或 5xx 状态码。健壮的代码会先检查 nil 情况,再根据状态码进行分支处理。
local body, code = http.request(url)
if not body then
print("transport error:", code)
elseif code >= 400 then
print("http error:", code)
end快速检查
请回想一下,http.request 的简单 URL 形式会返回什么。
回顾
您学习了 socket.http 模块:返回正文、状态码和标头的简单 GET 请求、使用 ltn12 接收器和源的通用表形式、POST 请求正文、自定义标头、重定向以及超时。
您还区分了传输错误(nil)和 HTTP 状态错误,并了解到 HTTPS 需要 LuaSec 的 ssl.https。至此,您完成了从原始 TCP 到 HTTP 的网络学习之旅。
常见问题解答
「HTTP 请求」课时是免费的吗?
是的 — 「HTTP 请求」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「HTTP 请求」这节课中我会学到什么?
获取 Web 资源。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「HTTP 请求」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。