转眼一个月又过去了,这次主要 mock 功能搞了很久,网上资料主要集中在后端单元测试的 mock,以及前端自己项目的 mock
后端:
前端:
在茫茫帖子中找到了一个 springboot 动态 mock 能够实现我的想法:https://blog.csdn.net/lt326030434/article/details/108649878
最后决定:后端使用 springboot 自己做服务,前端使用 mock.js 写写规则
springboot service 关键代码:
public void dynamicMock(HttpServletRequest request, HttpServletResponse response) {
String requestPath = request.getServletPath();
LambdaQueryWrapper<ApiMock> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ApiMock::getMockUrl, requestPath);
ApiMock mock = baseMapper.selectOne(wrapper);
if (mock != null) {
OutputStream outputStream = null;
//解决浏览器乱码
response.setHeader("content-type", "text/html;charset=utf-8");
try {
outputStream = response.getOutputStream();
if (mock.getStatus() == 0) {
byte[] dataByteArr = mock.getResponseBody().getBytes();
outputStream.write(dataByteArr);
response.setStatus(mock.getResponseCode());
}else {
String error = "您未开启mock状态";
byte[] dataByteArr = error.getBytes();
outputStream.write(dataByteArr);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
通过 status 状态来控制 mock 的开关,response.setStatus 可以返回自己想要的响应码
前端代码:
import Mock from "mockjs"
var dataMock = Mock.mock(this.jsonData);
this.apiMock.responseBody = JSON.stringify(dataMock)
前端通过 Mock.js 把模板数据转换,然后传给数据库保存(这里用的有点担心,怕数据太大影响数据库的性能,但是暂时没有找到更好的办法)
最后的效果图:
mock 地址是 baseUrl + apiId + 接口路径,方法和响应码可以自己定义,Mock.js 的模板也可以自己定义,但必须要是 json 格式
做完这个功能问安卓开发怎么样,答曰:baseUrl 太麻烦了,apiId 也不是固定的,总之就是麻烦,可是大家不都是这么做的么