OpenResty目前内建支持的有Base64和JSON两种格式,下面我们介绍base64.
Base64格式使用64个字符,可以把任意数据转换为ASCII码可见字符串,应用得非常普遍。OpenResty使用ngx.encode_base64和ngx.decode_base64这两个函数实现了标准的Base64编码和解码:
-
local str = "1234"
-
local enc = ngx.encode_base64(str) -- 编码为“ MTizNA==”
-
local dec= ngx.decode_base64(enc) -- 解码还原
Base64编码有一个“padding”特性,编码后长度不是4 的倍数时会用“=”填补。向ngx.encode_base64传递第二个参数nopadding可以禁止填充。
ngx.encode_base64(str, true) -- 编码结果会是"MTizNA"
标准的Base64编码使用了字符“+”和“/”,不适合用在HTTP协议的URL里,因为“ + ”和“/”会被转换成“%2F ” “ %2B ”导致编码损坏,所以Base64编码还有一种改进形式,它用“-”和“_”替代了“+”和“/”,也不使用“=”填补,可以安全地用在URL 里。
OpenResty在库ngx.base64里提供两个函数: encode_base64url和decode_base64-url支持Base64URL 编码:
local json = require('cjson')
local base64 = require('ngx.base64')
local str = {name = "宋", age = 11, sex = "男"}
str = base64.encode_base64url(json.encode(str))
ngx.say(str) --eyJzZXgiOiLnlLciLCJhZ2UiOjExLCJuYW1lIjoi5a6LIn0