最近看了一个MockNet库,作者介绍它是为了方便客户端网络接口的开发和测试,简单来说就是在本地启动服务器用来响应客户端的网络请求。
平时写项目的时候,总会遇到这些情况:
- 服务器接口还没有写好,Android 客户端只能先做一些界面的开发工作,遇到需要展示数据的地方只能先留着或者用一些假数据填充,服务器接口写好以后,这些代码又得删掉或者再改。
- 在调试网络接口的时候,往往需要后台客户端一起配合,有时候会花不少时间确认是服务器还是客户端的问题,之后联调也很花时间。
- 在没有网络但是又需要展示应用功能的时候,只能用一堆 if else 来添加假数据或者数据库里的数据。代码写起来很不方便。
Mocknet库的解决方案:
- 首先是网络接口开发的问题,通过 MockNet 这个库,无需后台接口完成就可以进行网络接口的开发,开发流程要更顺畅一点。
- 其次是网络接口调试的问题,通过 MockNet 这个库,在没有后台同学的帮助下也可以对 Android 客户端网络接口进行调试。
- 最后是没有网络需要展示功能的问题,通过 MockNet 这个库,没有网络一样可以展示应用的网络功能。
然而集成到同学会的过程中一直失败,无法集成,如果要实现类似的功能只能自己实现,只需拦截网络请求不等待网络回调而返回我们自己预先设定的结果即可。
由于同学会安卓使用的是Okhttp+retrofit网络框架,所以在OkHttpClient初始化时注册一个拦截器,我们在配置文件中配置要拦截的Api地址和返回json串,然后在拦截器中对网络请求地址进行判断,如果是要拦截的api就返回指定结果。
代码片段:
//模拟响应拦截器
private class simulateResponse implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
final HttpUrl url = request.url();//获取路径
//判断是否需要拦截
String apiNname = NetApiInterceptorList.isExist(url.toString());
if(null != apiNname){
String responseContent = NetApiInterceptorList.getVisualResponseByApi(apiNname);
return new Response.Builder()
.code(200)
.message("模拟响应")
.body(ResponseBody.create(MediaType.parse("UTF-8"),responseContent))
.request(request)
.protocol(HTTP_1_1)
.build();
}
return chain.proceed(request);
}
}
//OkHttpClient初始化时注册上述拦截器
OkHttpClient.Builder().addInterceptor(new simulateResponse());
//需要拦截api及返回结果配置类
public class NetApiInterceptorList {
private static HashMap<String, String> apiResponse = new HashMap<>();
public static String isExist(String apiName){
for(String interceptApi : apiResponse.keySet()){
if(apiName.startsWith(interceptApi)){
return interceptApi;
}
}
return null;
}
public static String getVisualResponseByApi(String apiName){
return apiResponse.get(apiName);
}
public static void init(){
if(apiResponse.size() > 0){
return;
}
apiResponse.put(CMUApi.GET_MESSAGE, "{\"result\":\"000000\",\"msg\":\"调用成功\",\"data\":{\"userid\":\"TY6XFGLSUICQ2\",\"empno\":\"Y6XFGLSUICQ2\",\"userName\":\"18938856298\",\"sex\":\"未知\",\"status\":\"普通群员\",\"idType\":\"身份证\",\"empIdNo\":\"不详\",\"mobileNo\":\"18938856298\",\"homeAddr\":null,\"claimBankNo\":null,\"accountNo\":null,\"wechat\":\"微信\",\"occupation\":null,\"nickname\":\"昵称\"}}");
apiResponse.put(CMUApi.ABOUT_MONEY, "{\"result\":\"000000\",\"msg\":\"调用成功\",\"data\":{\"userid\":\"TY6XFGLSUICQ2\",\"empno\":\"Y6XFGLSUICQ2\",\"userName\":\"18938856298\",\"sex\":\"未知\",\"status\":\"普通群员\",\"idType\":\"身份证\",\"empIdNo\":\"不详\",\"mobileNo\":\"18938856298\",\"homeAddr\":null,\"claimBankNo\":null,\"accountNo\":null,\"wechat\":\"微信\",\"occupation\":null,\"nickname\":\"昵称\"}}");
}
网友评论