在上一篇文章中我们成功让OpenResty返回了静态的JSON数据。但在真实业务场景中前端请求往往携带各种参数URL中的查询参数、路径中的ID、请求头中的Token甚至是POST提交的表单或JSON数据。如何精准地“捕获”这些参数这是编写动态业务逻辑的第一步。今天我们将系统梳理OpenResty中五种常见的参数获取方式并通过一个实战案例演示如何提取路径参数并动态生成响应。一、OpenResty参数获取全景图OpenResty基于Nginx对请求的处理非常严谨不同类型的参数需要使用不同的API。1. 路径占位符这是RESTful风格API中最常用的方式如/item/1001。配置需要在location中使用~进行正则匹配。获取匹配到的内容会存入ngx.var数组中。2. GET请求参数即URL问号后面的参数如?id1001typebook。APIngx.req.get_uri_args()返回一个包含所有查询参数的 Table。3. 请求头参数用于获取 Token、User-Agent 等信息。APIngx.req.get_headers()返回一个包含所有请求头的 Table。4. POST表单参数用于处理application/x-www-form-urlencoded格式的数据。关键前置必须先调用ngx.req.read_body()读取请求体否则拿不到数据APIngx.req.get_post_args()5. JSON请求体参数现代前端如Vue/React最常用的格式。关键前置同样需要先调用ngx.req.read_body()。APIngx.req.get_body_data()注意它返回的是原始 JSON 字符串通常需要使用cjson模块进行解析。二、实战案例动态获取路径参数为了演示最复杂的“路径参数”获取我们来做一个小实验从 URL/api/item/10001中提取商品ID并将其动态拼接到返回的JSON中。1. 修改 Nginx 配置我们需要使用正则表达式来“捕获”ID。在nginx.conf中配置location ~ /api/item/(\d) { default_type application/json; # 这里的正则表达式 (\d) 会捕获数字部分 content_by_lua_file /usr/local/openresty/nginx/lua/item.lua; }关键点~表示启用正则匹配。(\d)表示匹配一个或多个数字并将其作为分组捕获。2. 编写 Lua 脚本在item.lua中我们通过ngx.var获取捕获到的参数-- 获取路径中捕获的第一个分组参数即ID local id ngx.var[1] -- 动态拼接JSON字符串 -- 注意Lua中使用 .. 进行字符串连接 local json_data [[ { code: 200, msg: success, data: { id: ]] .. id .. [[, title: 商品详情 - ID: ]] .. id .. [[ } } ]] ngx.say(json_data)3. 验证效果重载配置nginx -s reload后我们在浏览器访问访问/api/item/10001→ 返回 JSON 中id: 10001访问/api/item/88888→ 返回 JSON 中id: 88888你会发现返回的数据随着URL的变化而实时变化这就是动态接口的雏形三、总结与避坑指南通过今天的案例我们掌握了OpenResty处理参数的核心能力。重点回顾路径参数最灵活适合RESTful风格使用ngx.var[1]获取。POST/JSON参数最容易出错切记先读 Body(ngx.req.read_body())再获取参数。字符串拼接Lua 中使用..运算符配合长括号[[ ]]可以优雅地处理 JSON 模板。掌握了参数获取我们就打通了“接收请求”这一环。接下来我们就可以根据这些参数去查询 Redis 或 数据库真正实现业务逻辑了。知识点核心总结知识点核心内容技术实现要点难度系数路径参数获取正则表达式匹配路径占位符ngx.var[1]获取分组参数★★★☆☆请求头参数键值对结构获取ngx.req.get_headers()★★☆☆☆GET请求参数URL问号拼接参数ngx.req.get_uri_args()★★☆☆☆POST表单参数表单数据解析ngx.req.read_body()get_post_args★★★☆☆JSON参数请求体JSON解析ngx.req.get_body_data()★★★★☆参数拼接Lua字符串连接语法..运算符动态拼接★☆☆☆☆正则表达式数字ID匹配规则\d匹配多位数字★★★☆☆动态响应路径参数动态返回正则分组注入响应体★★☆☆☆