之前在包建强老师的公开课上听过这个思路,一直没有使用,正好最近在家无聊,想要开发一下公司项目,但是想要模拟假数据,于是想起了这个方案
场景
- 接口访问不通
- 想要模拟数据(比如模拟已经购买的情况等)
实现
我们项目中通常都会对网络操作进行封装,最后就是:从网络请求到json/xml数据->解析成对象->使用
所以我们可以在网络请求之前拦截到url,并且解析url,根据参数要求,返回提前写死的json数据,之后就可以跳过网络请求这一步了。
具体的实现方案有很多,我就贴一下我的吧
//网络前拦截
public void setUrl(String path, String url) throws Exception {
this.requestUrl = url;
boolean cacheExist = true;
String result = getCacheData(path, url);//从缓存读
result = MockUtil.getInstance().getData(url);//缓存没有从MockUtil读,这个MockUtil就是用来模拟数据的工具类
if (TextUtils.isEmpty(result)) {//如果缓存也没有,模拟数据也没有,再请求网络
cacheExist = false;
result = NetUtil.readString(url);
}
if (!TextUtils.isEmpty(result)) {//解析数据
parse(path, url, result, cacheExist);
}
}
//MockUtil的实现
public String getData(String url) throws MalformedURLException {
if (mock) {//是否开启mock,通过它可以一键控制开关,这个开关也可以配在配置文件中,看你需求喽
return handleData(url);//通过URL来获取数据
}
return null;
}
//通过url返回数据(这里的逻辑是灵活的,怎么搞都行,不外乎就是判断参数,判断地址等,拿假数据也是灵活的,我是放在assert目录下,不同的数据不同的命名)
private String handleData(String url) {
Uri uri = Uri.parse(url);
if (url.startsWith("http://xx.xx.xx/movielist2.")) {//我这里想要模拟两种数据:这个接口下的数据,如果参数“self”是0返回一种,是1返回另一种
String self = uri.getQueryParameter("self");
if (self.equals("0")) {
return readDataFromFile("noself.json");//通过文件读取文件中的数据,这些数据就是模拟的json串
} else {
return readDataFromFile("hasself.json");
}
}
return null;
}