openresty前端開發入門二

路人jia發表於2018-08-23

這一章主要介紹介紹怎麼獲取請求引數,並且處理之後返回資料

我們知道http請求通常分為兩種,分別是GET,POST,在http協議中,GET引數通常會緊跟在uri後面,而POST請求引數則包含在請求體中,nginx預設情況下是不會讀取POST請求引數的,最好也不要試圖使改變這種行為,因為大多數情況下,POST請求都是轉到後端去處理,nginx只需要讀取請求uri部分,以及請求頭

由於這樣的設計,所以獲取請求引數的方式也有兩種

GET

local args = ngx.req.get_uri_args() -- 這裡是一個table,包含所有get請求引數
local id = ngx.var.arg_id -- 這裡獲取單個請求引數,但是如果沒有傳遞這個引數,則會報錯,推薦上面那張獲取方式

POST

ngx.req.read_body() -- 先讀取請求體
local args = ngx.req.get_post_args() -- 這裡也是一個table,包含所有post請求引數

可以通過下面這個方法獲取http請求方法

local request_method = ngx.var.request_method -- GET or POST

為了統一獲取請求引數的方式,隱藏具體細節,提供一個更友好的api介面,我們可以簡單的封裝一下

lua/req.lua

local _M = {}

-- 獲取http get/post 請求引數
function _M.getArgs()
    local request_method = ngx.var.request_method
    local args = ngx.req.get_uri_args()
    -- 引數獲取
    if "POST" == request_method then
        ngx.req.read_body()
        local postArgs = ngx.req.get_post_args()
        if postArgs then
            for k, v in pairs(postArgs) do
                args[k] = v
            end
        end
    end
    return args
end

return _M

這個模組就實現了引數的獲取,而且支援GET,POST兩種傳參方式,以及引數放在uri,body的post請求,會合並兩種方式提交的引數

接下來我們可以寫一個簡單的lua,來引入這個模組,然後測試一下效果

conf/nginx.conf

worker_processes  1;

error_log logs/error.log;

events {
    worker_connections 1024;
}

http {
    lua_package_path /Users/Lin/opensource/openresty-web-dev/demo2/lua/?.lua;  # 這裡一定要指定package_path,否則會找不到引入的模組,然後會500
    server {
        listen 80;
        server_name localhost;
        lua_code_cache off;
        location ~ /lua/(.+) {
            default_type text/html;    
            content_by_lua_file lua/$1.lua;
        }
    }
}

lua/hello.lua

local req = require "req"

local args = req.getArgs()

local name = args[`name`]

if name == nil or name == "" then
    name = "guest"
end

ngx.say("<p>hello " .. name .. "!</p>")

測試

http://localhost/lua/hello?name=Lin
輸出 hello Lin!
http://localhost/lua/hello

輸出 hello guest!

ok 到這裡,我們已經能夠根據請求的引數,並且在做一下處理後返回資料了

示例程式碼 參見demo2部分


相關文章