上一章節(jié),主要介紹了一下如何使用不同 location 進(jìn)行協(xié)作,對(duì) location 進(jìn)行糅合,往往都是要需要參數(shù)的二次調(diào)整。如何正確獲取傳遞參數(shù)、設(shè)置參數(shù),就是你的必修課了。本章目的是給出在 OpenResty 的世界中,我們?nèi)绾握_獲取、設(shè)置 uri 參數(shù)。
首先看一下官方 API 文檔,獲取一個(gè) uri 有兩個(gè)方法:ngx.req.get_uri_args
、ngx.req.get_post_args
,二者主要的區(qū)別是參數(shù)來(lái)源有區(qū)別。
參考下面例子:
server {
listen 80;
server_name localhost;
location /print_param {
content_by_lua_block {
local arg = ngx.req.get_uri_args()
for k,v in pairs(arg) do
ngx.say("[GET ] key:", k, " v:", v)
end
ngx.req.read_body() -- 解析 body 參數(shù)之前一定要先讀取 body
local arg = ngx.req.get_post_args()
for k,v in pairs(arg) do
ngx.say("[POST] key:", k, " v:", v)
end
}
}
}
輸出結(jié)果:
? ~ curl '127.0.0.1/print_param?a=1&b=2%26' -d 'c=3&d=4%26'
[GET ] key:b v:2&
[GET ] key:a v:1
[POST] key:d v:4&
[POST] key:c v:3
從這個(gè)例子中,我們可以很明顯看到兩個(gè)函數(shù) ngx.req.get_uri_args
、ngx.req.get_post_args
獲取數(shù)據(jù)來(lái)源是有明顯區(qū)別的,前者來(lái)自 uri 請(qǐng)求參數(shù),而后者來(lái)自 post 請(qǐng)求內(nèi)容。
當(dāng)我們可以獲取到請(qǐng)求參數(shù),自然是需要這些參數(shù)來(lái)完成業(yè)務(wù)控制目的。大家都知道,URI 內(nèi)容傳遞過(guò)程中是需要調(diào)用 ngx.encode_args 進(jìn)行規(guī)則轉(zhuǎn)義。
參看下面例子:
location /test {
content_by_lua_block {
local res = ngx.location.capture(
'/print_param',
{
method = ngx.HTTP_POST,
args = ngx.encode_args({a = 1, b = '2&'}),
body = ngx.encode_args({c = 3, d = '4&'})
}
)
ngx.say(res.body)
}
}
輸出結(jié)果:
? ~ curl '127.0.0.1/test'
[GET] key:b v:2&
[GET] key:a v:1
[POST] key:d v:4&
[POST] key:c v:3
與我們預(yù)期是一樣的。
如果這里不調(diào)用ngx.encode_args
,可能就會(huì)比較丑了,看下面例子:
local res = ngx.location.capture('/print_param',
{
method = ngx.HTTP_POST,
args = 'a=1&b=2%26', -- 注意這里的 %26 ,代表的是 & 字符
body = 'c=3&d=4%26'
}
)
ngx.say(res.body)
PS:對(duì)于 ngx.location.capture 這里有個(gè)小技巧,args 參數(shù)可以接受字符串或Lua 表的,這樣我們的代碼就更加簡(jiǎn)潔直觀。
local res = ngx.location.capture('/print_param',
{
method = ngx.HTTP_POST,
args = {a = 1, b = '2&'},
body = 'c=3&d=4%26'
}
)
ngx.say(res.body)