OpenResty(Lua)笔记总结一

json 解 析 的 异 常 捕 获

local cjson      = require "cjson"

local json_str  = [[{"name":"ybl}]]

local tab         = cjson.decode(json_str)

ngx.say(type(tab))

代码执行错误日志如下:

2016/12/11 11:51:58 [error] 8364#0: *2810371 lua entry thread aborted: runtime error: /web/lua/cc2_demo.lua:167: Expected value but found unexpected end of string at character 14

stack traceback:

coroutine 0:

[C]: in function 'decode'

/web/lua/cc2_demo.lua:167: in function , client: 127.0.0.1, server: localhost, request: "GET /demo HTTP/1.1", host: "127.0.0.1"

如果需要在Lua中处理错误,必须使用函数pcall(protected call)来包装需要执行的代码。pcall接收一个函数和要传递给后者的参数,并执行,执行结果:有错误、无错误;返回值true或者或false, errorinfo。pcall以一种"保护模式"来调用第一个参数,因此pcall可以捕获函数执行中的任何错误。

所以改良一下代码如下

function json_decode( str )

            local cjson         = require "cjson"

            local json_value = nil

            pcall(function (str) json_value = cjson.decode(str) end, str)

            return json_value

end

local json_str_1  = [[{"name":"ybl}]]

local json_str_2  = [[{"name":"ybl"}]]

local tab1            = json_decode(json_str_1)

local tab2            = json_decode(json_str_2)

ngx.say(type(tab1))

ngx.say(type(tab2))

运行结果:nil   和  table


Lua 中 pairs 和 ipairs 的 区 别

这个新手很容易犯的错,标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的,由于在 lua 内部实际采用 哈希表保存键值对、数组保存普通值,table和数组还是有区别的,简单这样理解吧,哈希表是key value类型的, 数组是索引数组,所以在lua中

pairs  可以迭代索引数组和哈希类型的数组

ipairs 可以迭代索引数组,哈希类型的数组不行

首先他们两个效率非常高,比for,while等高很多;ipairs比pairs效率还要高

举例:

local arr_1 = {1,2,3,4,5,6,7,8,9,0}

local arr_2 = {name = "ybl" , age = 22 , sex = "男" , likes = "篮球,跑步,健身"}

local arr_3 = { first="red", "blue", third="green", "yellow"}

针对arr_1,pairs和ipairs都可以迭代,推荐ipairs

针对arr_2,pairs迭代,ipairs空值

针对arr_3,pairs迭代,ipairs空值


非空判断

这里的ken狠多,用如下封装的方法就可以,如果你想了解更多,可查看OpenResty最佳实践

function isTableEmpty(t)

        if t == nil or next(t) == nil then

                     return true

         else

                      return false

          end

end

lua获取GET 和 POST参数

function getpost()

         local args = {}

         local request_method = ngx.var.request_method

         if  "GET" == request_method then

                     args  =  ngx.req.get_uri_args()

          elseif  "POST" == ngx.req.get_method() then

                     ngx.req.read_body()

                     args  =  ngx.req.get_post_args()

           end

           return args

end


lua获取请求 body-适合获取http请求post和get参数【推荐】

ngx.req.get_body_data() 读请求体,会偶尔出现读取不到直接返回 nil 的情况。

所以得事先调用ngx.req.read_body(),强制本模块读取请求体

ngx.req.read_body()

local json_str = ngx.req.get_body_data()

--如果是json,则可以转化为table等等。。。

lua发起http get和post请求

function http_post(url,table_par)

          local http = require "http"

          local httpc = http.new()

          local res, err = httpc:request_uri(url,{

                        method = 'POST',

                        body = cjson.encode(table_par),

                        headers = {["Content-Type"] = "application/x-www-form-urlencoded",}

            })

            if not res then

                        return 100

             end

             return res.body

end

function comm_fun:http_get(url,table_par)

             local http = require "http"

             local httpc = http:new()

             local res, err = httpc:request_uri(url, {

                          method = "GET",

                          query  = table_par,

                          --ssl_verify = false, -- 需要关闭这项才能发起https请求

                           headers = {["Content-Type"] = "application/x-www-form-urlencoded" },

              })

              if not res then

                           return 100

               end

               return res.body

    end

Lua获取请求者的ip,浏览器,系统等信息

function getBrowser()

               local user_agent = ngx.req.raw_header()

               local browser = "others"

               if ngx.re.match(user_agent,"Chrome") then

                            browser = "Chrome"

                elseif ngx.re.match(user_agent,"Firefox") then

                            browser = "Firefox"

                 elseif ngx.re.match(user_agent,"QQBrowser") then

                             browser = "QQBrowser"

                 elseif ngx.re.match(user_agent,"Safari") then

                              browser = "Safari"

                 elseif ngx.re.match(user_agent,"Opera") then

                               browser = "Opera"

                  elseif ngx.re.match(user_agent,"MSIE 11.0") or ngx.re.match(user_agent,"rv:11.0") then

                               browser = "IE 11.0"

                  elseif ngx.re.match(user_agent,"MSIE 10.0") or ngx.re.match(user_agent,"rv:10.0") then

                                browser = "IE 10.0"

                   elseif ngx.re.match(user_agent,"MSIE 9.0") or ngx.re.match(user_agent,"rv:9.0") then

                                browser = "IE 9.0"

                   elseif ngx.re.match(user_agent,"MSIE 8.0") or ngx.re.match(user_agent,"rv:8.0") then

                                browser = "IE 8.0"

                   elseif ngx.re.match(user_agent,"MSIE 7.0") or ngx.re.match(user_agent,"rv:7.0") then

                                browser = "IE 7.0"

                   elseif ngx.re.match(user_agent,"MSIE 6.0") or ngx.re.match(user_agent,"rv:6.0") then

                                 browser = "IE 6.0"

                     else

                                  browser = "others"

                      end

                      return browser

end

function getSystem()

            local user_agent = ngx.req.raw_header()

            local system = "others"

            if ngx.re.match(user_agent,"Mac OS") then

                       system = "Mac OS"

            elseif ngx.re.match(user_agent,"Mac") then

                       system = "Macintosh"

             elseif ngx.re.match(user_agent,"Windows NT 10.0") then

                        system = "Windows 10"

             elseif ngx.re.match(user_agent,"Windows NT 6.2") then

                        system = "Windows 8"

             elseif ngx.re.match(user_agent,"Windows NT 6.1") then

                        system = "Windows 7"

              elseif ngx.re.match(user_agent,"Windows NT 6.0") then

                         system = "Windows Vista"

               elseif ngx.re.match(user_agent,"Windows NT 5.1") then

                         system = "Windows XP"

               elseif ngx.re.match(user_agent,"Windows NT 5.0") then

                          system = "Windows 2000"

               elseif ngx.re.match(user_agent,"linux") then

                          system = "Linux"

               elseif ngx.re.match(user_agent,"unix") then

                          system = "Unix"

                elseif ngx.re.match(user_agent,"FreeBSD") then

                           system = "FreeBSD"

                elseif ngx.re.match(user_agent,"IRIX") then

                            system = "IRIX"

                elseif ngx.re.match(user_agent,"OSF1") then

                            system = "OSF1"

                elseif ngx.re.match(user_agent,"BSD") then

                             system = "BSD"

                 elseif ngx.re.match(user_agent,"NetBSD") then

                              system = "NetBSD"

                 elseif ngx.re.match(user_agent,"HPUX") then

                               system = "HPUX"

                 elseif ngx.re.match(user_agent,"AIX") then

                                system = "AIX"

                  elseif ngx.re.match(user_agent,"PowerPC") then

                                system = "PowerPC"

                  elseif ngx.re.match(user_agent,"sun") then

                                system = "SUN"

                  elseif ngx.re.match(user_agent,"ibm") then

                                 system = "IBM"

                   end

                   return system

end

function getIP()

          return ngx.var.remote_addr

end

通过FFI的方式加载其他C接口动态库来获取系统

local ffi = require("ffi")

if ffi.os == "Windows" then

          ngx.say("windows")

elseif ffi.os == "OSX" then

          ngx.say("MAC OS X")

else

           ngx.say(ffi.os)

end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容