在 Lua 中处理 HTTP 请求
使用 ngx API 访问请求标头、请求体和参数,并构造响应。
在 Lua 中处理 HTTP 请求 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
读取请求方法和 URI
请从 ngx 命名空间访问 HTTP 方法和 URI。
-- content_by_lua_block
local method = ngx.req.get_method()
local uri = ngx.var.uri
ngx.say("Method: " .. method .. ", URI: " .. uri)读取请求标头
ngx.req.get_headers() 返回一个包含请求标头的表。
local headers = ngx.req.get_headers()
local auth = headers["Authorization"]
if not auth then
ngx.status = 401
ngx.say("Unauthorized")
ngx.exit(ngx.HTTP_UNAUTHORIZED)
end读取查询参数
ngx.req.get_uri_args() 返回一个包含 URL 查询参数的表。
local args = ngx.req.get_uri_args()
local page = tonumber(args.page) or 1
local size = tonumber(args.size) or 20
ngx.say("Page: " .. page .. ", Size: " .. size)读取请求体
请先显式调用 ngx.req.read_body(),然后再读取请求体。
ngx.req.read_body()
local body = ngx.req.get_body_data()
if not body then
ngx.status = 400
ngx.say("Empty body")
return
end解析 JSON 请求体
请使用 JSON 库(例如 cjson)解析请求体。
local cjson = require("cjson")
ngx.req.read_body()
local body = ngx.req.get_body_data()
local ok, data = pcall(cjson.decode, body)
if not ok then
ngx.status = 400
ngx.say("Invalid JSON")
return ngx.exit(400)
end设置响应标头
请在调用 ngx.say 或 ngx.print 之前,通过 ngx.header 设置响应标头。
ngx.header["Content-Type"] = "application/json"
ngx.header["X-Request-ID"] = ngx.var.request_id写入响应
ngx.say(s) 写入一个字符串并换行。ngx.print(s) 写入字符串但不换行。ngx.exit(code) 使用给定的 HTTP 状态码终止请求。
ngx.status
请在写入响应正文之前,通过 ngx.status = 404 设置 HTTP 状态码。
ngx.status = 404
ngx.header["Content-Type"] = "application/json"
ngx.say(cjson.encode({error = "Not Found"}))内部重定向
ngx.exec("/other/path") 会在不产生额外 HTTP 往返的情况下,将请求内部重定向到另一个 Nginx 位置块。
子请求
ngx.location.capture("/api") 会向另一个位置发起子请求,并返回一个包含状态、标头和正文的表。
local res = ngx.location.capture("/internal/auth")
if res.status ~= 200 then
ngx.exit(403)
end请求上下文共享
ngx.ctx 是一个按请求创建的表,用于在不同阶段处理程序之间共享数据(访问 → 内容 → log)。
HTTP 处理问题
在 OpenResty 中,哪个函数会读取 URL 查询参数?
回顾:处理 HTTP 请求
使用 ngx.req 函数读取方法、标头、查询参数和请求体。在写入响应之前设置 ngx.header 和 ngx.status。使用 ngx.say/ngx.print 输出内容。通过 ngx.ctx 共享按请求存储的数据。
常见问题解答
「在 Lua 中处理 HTTP 请求」课时是免费的吗?
是的 — 「在 Lua 中处理 HTTP 请求」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「在 Lua 中处理 HTTP 请求」这节课中我会学到什么?
使用 ngx API 访问请求标头、请求体和参数,并构造响应。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「在 Lua 中处理 HTTP 请求」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- OpenResty 架构
- 在 Lua 中处理 HTTP 请求
- Cosocket 和非阻塞 TCP
- 共享内存字典