使用 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",
[...]]
},
endpont "/api/v1/get_client_id" 只接收一个参数:
{"user_mail_1":"test@test.es"}
我想要,我的端点“/ call”接收的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”解析为表格、字典或我可以转换数据的东西的方法吗?
是另一种转换请求数据的方法吗?
使用 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 用作 table、dict 或类似的东西,我可以替换 dict 键/值。例如: req['xxx] = 'xxx' 或迭代 req.keys