使用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",
[...]]
},
endopont "/api/v1/get_client_id“只接收一个param:
{"user_mail_1":"test@test.es"}
我想,在lua剧本中,我的首字母"/call“收到:
{"email":"test@test.es"}
并在发送前转换:
{"user_mail_1":"test@test.es"}
我尝试使用gsub,但是使用body()作为"string“是没有效率的。
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或其他我可以转换数据的方法吗?
是另一种转换请求数据的方法吗?
使用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
发布于 2022-02-11 09:38:05
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)))
第一次替换后,该The参数将停止gsub。
https://stackoverflow.com/questions/71076675
复制相似问题