請求處理相關函數
更新時間 2024-07-22 09:45:33
最近更新時間: 2024-07-22 09:45:33
分享文章
本文簡述請求處理可以使用的相關函數的語法、作用、入參、返回值、示例。
ctyun.req.start_time
函數信息詳見下表:
| 項目 | 描述 |
|---|---|
| 語法 | secs = ctyun.req.start_time() |
| 作用 | 用來獲取當前請求創建時的時間戳。 |
| 入參 | 無。 |
| 返回值 | secs: number。浮點類型時間戳,單位為秒(小數部分可表示毫秒)。 |
示例:
ctyun.sleep(1)
local request_time = ctyun.now() - ctyun.req.start_time()
ctyun.resp.set_output(tostring(request_time))
結果:1.0030000209808。
ctyun.req.raw_header
函數信息詳見下表:
| 項目 | 描述 |
|---|---|
| 語法 | raw_header_ str = ctyun.req.raw_header(no_request_line?) |
| 作用 | 用來獲取Nginx 服務器接收到的原始 HTTP 協議頭。 |
| 入參 | no_request_line? : bool。no_request_line:可選參數。參數為 true 可以去除結果中的請求行。 |
| 返回值 | raw_header_str: string。Nginx接收到的原始 HTTP 協議頭。 |
示例:
默認時,請求行和末尾的 CR LF 結束符也被包括在內:
local header = ctyun.req.raw_header()
ctyun.resp.set_output(header)
-- 輸出:
-- GET /app/detail HTTP/1.1
-- Host: xopen.daliqc.cn:8080
-- User-Agent: curl/7.43.0
-- Accept: */*
可以通過指定可選的 no_request_line 參數為 true 來去除結果中的請求行:
local header_no_request_line = ngx.req.raw_header(true)
ctyun.resp.set_output(header_no_request_line)
-- 輸出:
-- Host: xopen.daliqc.cn:8080
-- User-Agent: curl/7.43.0
-- Accept: */*
ctyun.req.get_method
函數信息詳見下表:
| 項目 | 描述 |
|---|---|
| 語法 | method_name = ctyun.req.get_method() |
| 作用 | 獲取當前請求的 HTTP 請求方法名稱。結果為類似 "GET" 和 "POST" 的字符串。 |
| 入參 | 無。 |
| 返回值 | method_name: string。請求方法名稱字符串。 |
示例:
local method = ctyun.req.get_method()
if method ~= 'GET' then
ctyun.resp.exit(403)
end
ctyun.req.get_headers
函數信息詳見下表:
| 項目 | 描述 |
|---|---|
| 語法 | headers, err = ctyun.req.get_headers(max_headers?, raw?, get_dup?) |
| 作用 | 獲取當前請求的所有請求頭信息。 |
| 入參 | max_headers? number。指定獲取的最大請求頭數量。默認為100,0表示無限制。 raw? boolean。指定是否將請求頭名稱改為全小寫模式。默認為false,默認情況下,將請求頭名稱改為全小寫,并為Lua-table添加一個<可忽略大小寫、下劃線中劃線>的 __index元方法。get_dup?boolean。是否獲取重復頭的所有值。默認為false,只取重復頭的第一個值,如有兩個X-Real-Ip請求頭,只獲取第一個。 注:區別官方ngx.req.get_headers()增加的參數,若需要獲取重復請求頭所有數據,設置該參數為true。 |
| 返回值 | headers: table |
示例:
local h, err = ctyun.req.get_headers()
if err == "truncated" then
-- one can choose to ignore or reject the current request here
end
for k, v in pairs(h) do
-- ...
if type(v) == 'table' then -- 重復頭
-- ...
end
end
ctyun.req.set_header
函數信息詳見下表:
| 項目 | 描述 |
|---|---|
| 語法 | ctyun.req.set_header(header_name, header_value) |
| 作用 | 將當前請求的名為 header_name 的頭信息值設置為 header_value,如果此頭信息名稱已經存在,修改其值。 |
| 入參 | header_name: string。請求頭名稱 header_value:可以是string、數組形式或者nil(表示刪除) 。 |
| 返回值 | 無。 |
示例:
設置請求頭:
ctyun.req.set_header("Content-Type", "text/css")
支持重復頭設置:
ctyun.req.set_header("Foo", {"a", "abc"})
-- 此時會設置重復請求頭:
-- Foo: a
-- Foo: abc
清除請求頭:
ctyun.req.set_header("Test", nil)
ctyun.req.get_full_body_data
函數信息詳見下表:
| 項目 | 描述 |
|---|---|
| 語法 | data_str = ctyun.req.get_full_body_data() |
| 作用 | 獲取請求體,如果底層nginx保存為文件,也需要解析文件內容。 |
| 入參 | 無。 |
| 返回值 | data_str: string。請求體。 |
示例:
if ctyun.req.get_method() == "POST" then
local data_str = ctyun.req.get_full_body_data()
local data, err = ctyun.json.decode(data_str)
-- ......
end
ctyun.req.get_origin_url
函數信息詳見下表:
| 項目 | 描述 |
|---|---|
| 語法 | url_str = ctyun.req.get_origin_url() |
| 作用 | 獲取原始請求url,也就是nginx變量$request_uri的值。 |
| 入參 | 無。 |
| 返回值 | url_str: string。原始請求url。 |
示例:
local request_uri = ctyun.req.get_origin_url()
local m, err = ctyun.re.match(request_uri, "^/([^/]+)/.*")
if m[1] == 'path-1' then
ctyun.resp.exit(403)
end
ctyun.req.set_uri
函數信息詳見下表:
| 項目 | 描述 |
|---|---|
| 語法 | ctyun.req.set_uri(uri) |
| 作用 | 設置回源uri(不包含回源查詢參數)。 |
| 入參 | uri: string。回源uri。 |
| 返回值 | 無。 |
示例:
local original_uri = ctyun.var('uri')
local new_uri = ctyun.re.sub(original_uri, "^/[^/]+/(.*)", "/$1")
ctyun.req.set_uri(new_uri)
ctyun.req.get_uri_args
函數信息詳見下表:
| 項目 | 描述 |
|---|---|
| 語法 | args, err = ctyun.req.get_uri_args(max_args?) |
| 作用 | 獲取當前請求的 URI 請求參數,以Lua-table的形式給出。 |
| 入參 | max_args? : number。解析的最大參數個數,默認100;設置為0表示無限制。 |
| 返回值 | args: table。 err: string。 |
示例:
key 和 value 將根據 URI 編碼規則進行解碼。 多次出現同一個參數 key 時,將生成一個 Lua table,按順序保存其所有 value;沒有 key 的參數將被忽略。
local args, err = ctyun.req.get_uri_args()
if err == "truncated" then
-- one can choose to ignore or reject the current request here
end
for key, val in pairs(args) do
if type(val) == "table" then
ctyun.resp.set_output(key .. ": " .. table.concat(val, ", "))
else
ctyun.resp.set_output(key .. ": " .. tostring(val))
end
end
ctyun.req.set_uri_args
函數信息詳見下表:
| 項目 | 描述 |
|---|---|
| 語法 | ctyun.req.set_uri_args(args) |
| 作用 | 重寫當前請求的 URI 請求參數。 |
| 入參 | args: string 。Lua字符串,或key-value類型的Lua table。 |
| 返回值 | 無。 |
示例:
-- Lua 字符串類型的 args 參數:
ctyun.req.set_uri_args("a=3&b=hello%20world")
-- 或包含請求參數 key-value 對的 Lua table: (此時將根據 URI 轉義規則轉義參數的 key 和 value)
ctyun.req.set_uri_args({
a = 3,
b = 'hello world'
})
-- 此時請求參數轉化為 "a=3&b=hello%20world"(參數在字符串中的順序不定)。
-- 也支持多值參數:
ctyun.req.set_uri_args({ a = 3, b = {5, 6} })
-- 此時請求參數字符串為 "a=3&b=5&b=6"。
ctyun.req.http_version
函數信息詳見下表:
| 項目 | 描述 |
|---|---|
| 語法 | local ret = ctyun.req.http_version() |
| 作用 | 獲取請求HTTP版本。 |
| 入參 | 無。 |
| 返回值 | http_version: string ,Lua字符串。 |
示例:
local ret = ctyun.req.http_version()
-- result:
-- "1.1"
-- "2.0"
-- ......
ctyun.req.set_upstream_url
函數信息詳見下表:
| 項目 | 描述 |
|---|---|
| 語法 | ctyun.req.set_upstream_url(new_url_str) |
| 作用 | 設置回源url(包含回源查詢參數)。 |
| 入參 | new_url_str: string。回源url。 |
| 返回值 | 無。 |
示例:
local upstream_url = '/new_path' .. ctyun.var("uri") .. "?type=1&id=2"
ctyun.req.set_upstream_url(upstream_url)
ctyun.req.set_cache
函數信息詳見下表:
| 項目 | 描述 |
|---|---|
| 語法 | ctyun.req.set_cache(cache_host, cache_url, cache_mode, ttl) |
| 作用 | 設置本次請求的回源結果緩存在cdn中。 |
| 入參 | cache_host: string。緩存host cache_url:string。緩存url cache_mode: string。固定緩存時間/跟隨源站緩存(定值 "fixed" / “follow”)。默認為fixed, 非合法輸入初始化為默認值。 ttl: number。緩存時間,單位秒。如果是固定緩存,設置緩存多久; 如果跟隨源站也可以設置默認值(秒)。 |
| 返回值 | 無。 |
示例:
local cache_url = ctyun.var("uri") .. ctyun.var("arg_fileId") -- 保證緩存key與該文件一一對應
local cache_host = ctyun.var("host")
local default_cache_time = 24*3600 -- 單位: 秒
ctyun.req.set_cache(cache_host, cache_url, "follow", default_cache_time)
ctyun.req.enroll_header_back
函數信息詳見下表:
| 項目 | 描述 |
|---|---|
| 語法 | ctyun.req.enroll_header_back(callback_func, ...) |
| 作用 | 在收到響應頭時會回調callback_func函數。 |
| 入參 | callback_func: function。回調函數 ... : 回調函數的入參:其他任意類型。入參個數可以是不定的。 |
| 返回值 | 無。 |
示例:
local function func_header_callback(limit_rate)
ctyun.resp.set_header("Test", "new-header")
ctyun.resp.set_limit_rate(limit_rate)
end
ctyun.req.enroll_header_back(func_header_callback, '100K')
則執行該回調函數可以設置添加響應頭與限速。