0Pricing
Lua Academy · 课时

在 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. OpenResty 架构
  2. 在 Lua 中处理 HTTP 请求
  3. Cosocket 和非阻塞 TCP
  4. 共享内存字典
← 返回 Lua Academy