openapi
这个小demo基于前面创建的springboot+vue项目
第一次听说让我写个openapi的demo时,都不知道要干啥,想着openapi不就是接口嘛,百度了好一些也没搞懂我到底要去写啥,后来去研究了一下别人写好的openapi的代码,才大致明白是啥…
- 本篇前期准备:一个完整的springboot+vue项目集成shiro,redis(未写集成具体信息),构成一个简易的权限管理系统,这里也贴上之前的链接
springboot+vue之旅(一)
springboot+vue之旅(二) - 我们在项目里创建一个controller先写一个小接口,可以是随便查查用户信息什么的,作为我们openapi的接口
- 然后我们在vue中的router/index.js路由目录中,加入我们的openapi菜单,我的菜单如下:
{
path: '/openapi',
component: Layout,
meta: { title: 'openapi'},
name: 'openapi',
children: [
{
path: '/url',
component: () => import('@/views/openapi/url'),
name: 'openapi',
meta: { title: '服务管理' , name: 'url:list' }
},
{
path: '/userUrl',
component: () => import('@/views/openapi/userUrl'),
name: 'openapi',
meta: { title: '申请记录' , name: 'userUrl:list' }
},
{
path: '/test',
component: () => import('@/views/openapi/test'),
name: 'openapi',
meta: { title: '测试' }
}
]
},
服务管理
这个界面主要管理我们的可以提供给他人使用的接口,而只有登录系统的管理员拥有创建接口的权限(添加服务),由于是简易demo,我们把我们的接口信息分为以下几个部分:
分别为接口调用地址,接口名称,服务内容(包括如何调用,传递参数举例,和返回信息汇总等),最后加上一个是否启用的字段,以保证接口别人的接口是正常使用的接口,这里默认为开启,所以没有在图片中
,界面图如下:
申请记录
既然是一个接口,肯定是不能让人随意调用的,我们需要一个申请的通道,来指定我们允许调用我们接口的人,因此加入申请记录菜单:
登录人可以申请他想要调用的,已经开启的接口,然后通过管理员审核后,才可以实现调用:
这样一个简易的管理api就完成了
测试
由于接口是个开放接口,因此我们需要修改一下我们的接口,来保证以下几点
- 调用的接口是处于开启状态
- 验证调用人的信息是我们指定可以调用的人
- 参数加密,demo里用了个简单的rsa加密方式,可以自行百度如何加密
- 接口访问次数限制(demo里暂时未写,因为是简易的demo就没那么多东西)
当然,你可以加上自己需要的方式
最后分享一下我简易的后台接口:
public ResultInfo getUserRoleById() {
try {
DbUrl url = dbUrlService.getOne(new QueryWrapper<DbUrl>().like("url", "openapi/接口名"));//查询该接口是否启用
String publicKey = StrUtil.isCheckNull(request.getParameter("publicKey").trim());
publicKey=publicKey.replaceAll(" ","+");//这个替换主要因为前端传公钥的时候会将其中的加号改为空格,会导致我们查询失败
String userInfo = StrUtil.isCheckNull(request.getParameter("userInfo"));//加密的用户信息
String open = url.getOpen();
if ("0".equals(open)) {//确认接口开启
User user = userService.getOne(new QueryWrapper<User>().eq("public_key", publicKey));//用公钥查询访问人后面与传入进来的用户名对比确认访问人正确
if (user != null) {
String jsonUser = RSAUtils.decryptDataOnJava(userInfo, user.getPrivateKey());
JSONObject jsonObject = JSONObject.parseObject(jsonUser);
String username = jsonObject.getString("username");
if (StrUtil.isNotNull(username) && user.getUsername().equals(username)) {
String userId = jsonObject.getString("userId");
User getById = userService.getOne(new QueryWrapper<User>().eq("id", userId));
return renderSuccess(getById);
} else {
return renderError("用户名信息不匹配,请检查传入用户名");
}
}else{
return renderError("传入公钥有误");
}
} else {
return renderError("该服务未开启,请联系管理员");
}
} catch (Exception e) {
e.printStackTrace();
return renderError("系统异常,请联系管理员");
}
}
这样一个简易的demo就完成啦