使用lua转换Krakrnd中的请求数据



使用Krakend作为api网关。

我在krakend.json:中配置了一个端点

"endpoint":"/call",
"extra_config":{
"github.com/devopsfaith/krakend-lua/proxy":{
"sources":[
"/function.lua"
],
"pre":"pre_backend(request.load())",
"live":true,
"allow_open_libs":true
}
},
"method":"POST",
"output_encoding":"json",
"headers_to_pass":[
"*"
],
"backend":[
{
"url_pattern":"/api/v1/get_client_id",
[...]]
},

内口"/api/v1/get_client_id";只收到一个参数:

{"user_mail_1":"test@test.es"}

我想要,用lua脚本我的内点"呼叫";接收器:

{"email":"test@test.es"}

并在发送前转换:

{"user_mail_1":"test@test.es"}

我尝试使用gsub,但使用body((作为";字符串";没有效率。

function pre_backend( req )
print('--Backend response, pre-logic:'); 
local r = req;
r:params('test','test');
r:query('lovelyquery')
r:body('test','test');
lolcal v = r:body():gsub('email', 'user_mail_1')
...

是解析";req";作为一个表,dict或其他我可以转换数据的东西?

是转换REQUEST数据的另一种方法吗?

使用GSUB的示例:

function pre_backend( req )
print('--Backend response, pre-logic:'); 
print('--req');
print(req);
print(type(req));
local r = req;
print('--body');
print(type(r:body()));
print(r:body())
local body_transformed = r:body():gsub('email', 'user_mail_1');
print('--body_transformed');
print(body_transformed);
print(type(body_transformed));
end

控制台输出:

2022/02/11 09:59:52  DEBUG: [http-server-handler: no extra config]
--Backend response, pre-logic:
--req
userdata: 0xc0004f9b60
userdata
--body
string
{"email" : "test@test.es","test_field":"email"}
--body_transformed
{"user_mail_1" : "test@test.es","test_field":"user_mail_1"}
string

正如我们所看到的,由于替换了所有字符串,gsub并不有效。如果我可以使用req作为表、dict或类似的东西,我可以替换dict键/值。例如:req['xxx]='xxx'或迭代req.keys

gsub代表全局替换。它将替换字符串中出现的所有模式。

如果你只想在电子邮件地址前面替换"email",只需使用一种考虑到这一点的模式。

print((r:body():gsub('(")(email)("%s-:%s-"%w+@%w+%.%w+")', "%1user_mail_1%3")))

或者,如果你知道你只想替换第一次出现的电子邮件,你可以简单地这样做:

print((r:body():gsub("email", "user_mail_1", 1)))

第三个参数将在第一次更换后停止gsub。

最新更新