一、背景
kong作为api网关,除了反向代理后端服务外,还可对接口进行预处理。
比如本文提及的一个小功能,根据http header某个字段的值,等于多少的时候,返回一个固定的报文。
使用到的kong插件是pre-function。
https://i-blog.csdnimg.cn/direct/16bd642fc3c143eabcdf2762db1319b1.png" alt="在这里插入图片描述" />
除了上面的场景,还适用于拒绝整个域名的访问。
二、接口的重写
根据http header中的SchoolId,当等于2747时,返回[ { “valid”: false } ];反之,返回 [ { “valid”: true } ]
https://i-blog.csdnimg.cn/direct/9d015871e9fb4a01aae7f58273851693.png" alt="在这里插入图片描述" />
下面是其Lua脚本内容:
local school_id = kong.request.get_header("SchoolId") if school_id == "2747" then return kong.response.exit(200, '[ { "valid": false } ]') else return kong.response.exit(200, '[ { "valid": true } ]') end
验证:
- http header 的schoolId = 2747
https://i-blog.csdnimg.cn/direct/365ca7c5bd4d4c93a2ea69298f01a2fc.png" alt="在这里插入图片描述" />
- http header 的schoolId != 2747
https://i-blog.csdnimg.cn/direct/6da58d5a6394444a9fe491a46fc72c5b.png" alt="在这里插入图片描述" />
三、拒绝域名的请求
同样是使用pre-function插件实现。
https://i-blog.csdnimg.cn/direct/3810b7c84bf84e98a31912d16a46e8bc.png" alt="在这里插入图片描述" />
https://i-blog.csdnimg.cn/direct/bf239fdada9640beb07db073b09603e2.png" alt="在这里插入图片描述" />
Lua脚本内容为:
return kong.response.exit(503, '{code: 400, msg: "xx服务已下线,请联系技术支持处理!"}', {["Content-Type"] = 'application/json' })
经验证,域名的接口再次访问,返回报错。
https://i-blog.csdnimg.cn/direct/7885f4a586c74d35bb38056c0764b304.png" alt="在这里插入图片描述" />
四、总结
总之,kong的这款pre-function插件可以适用于许多场景,好处是灵活配置,支持lua脚本。当然,它只返回相对固定的报文,除非你使用Lua脚本去连接数据存储中间件。
不过,对于简单的一些场景够用了,这也提醒我们一点,在客户端请求接口的时候,尽量把一些标识性的字段通过http header上传上来。
比如schoolId 、 userId、 deviceId、ip等等,后期在kong网关便于读取并判断是否拦截请求。