App 研发录-MockService

本文介绍了一种在App研发中使用MockService和MockInterceptor进行网络请求模拟的方法,通过实现MockService抽象类来提供模拟数据,利用MockInterceptor拦截网络请求并返回预设的响应,适用于小公司或开发初期的快速迭代。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近又开始看App 研发录,每次看都会有豁然开朗的感觉,也许是糟心的代码看的有点多。

这个MockService 就是一个模拟网络获取数据的接口,不用每次都在等着api接口写完才能写具体的流程业务

public abstract class MockService {
    public abstract String getJsonData();

    public BaseResponse getSuccessResponse() {
        BaseResponse response = new BaseResponse();
        response.setError(false);
        response.setErrorType(0);
        response.setErrorMessage("");
        return response;
    }

    public BaseResponse getFailResponse(int errorType, String errorMessage) {
        BaseResponse response = new BaseResponse();
        response.setError(true);
        response.setErrorType(errorType);
        response.setErrorMessage(errorMessage);
        return response;
    }
}

因为小公司不用自己写网络请求库,而且现在流行 retrofit +rxJava,所以对原文中的代码做了下改变,

public class MockIntercepter implements Interceptor {
    private Gson mGson;

    public MockIntercepter() {
        mGson = new Gson();
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Response.Builder responseBuilder = new Response.Builder()
                .code(200).message("").request(chain.request()).
                        protocol(Protocol.HTTP_1_1).
                        addHeader("content-type", "application/json");
        Request request = chain.request();
        String requestUrl = request.url().toString();
        String apiKey = requestUrl.substring(requestUrl.lastIndexOf("/"));
        if(apiKey.contains("?")){
            apiKey = apiKey.substring(1,apiKey.indexOf("?"));
        }
        URLData urlData = UrlConfigManager.findURL(apiKey);
        if (urlData != null) {
            try {
                MockService mockService = (MockService) Class.forName(
                        urlData.getMockClass()).newInstance();
                String strResponse = mockService.getJsonData();
                responseBuilder.body(ResponseBody.create(MediaType.parse("application/json"), strResponse.getBytes()));
                return responseBuilder.build();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return chain.proceed(request);
    }
}

Url 读取和配置用已有的就行了

<?xml version="1.0" encoding="utf-8"?>
<url>
    <Node
        Expires="300"
        Key="getBannerList"
        MockClass="com.demo.MockMainBannerList"
        NetType="get" />

  
</url>

然后封装的时候把MockIntercepter 加到 okhttp 里面就好了

   private OkHttpClient initOkHttpClient() {
        OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
        //添加日志
        if (Utils.isAppDebug()) {
            HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
            httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            builder.addInterceptor(httpLoggingInterceptor);
            //mock data
            builder.addInterceptor(new MockIntercepter());
        }
        builder.connectTimeout(10, TimeUnit.SECONDS);
        builder.writeTimeout(10, TimeUnit.SECONDS);
        builder.readTimeout(10, TimeUnit.SECONDS);
        //添加缓存拦截器
        CacheInterceptor cacheInterceptor = new CacheInterceptor();
        builder.addInterceptor(cacheInterceptor);
        builder.addNetworkInterceptor(cacheInterceptor);
        return builder.build();
    }
/**
 * http交互处理类
 * Created by WZG on 2016/7/16.
 */
public class HttpManager {
    /*软引用對象*/
    private SoftReference<LifecycleProvider> mLifecycleProvider;

    public HttpManager(LifecycleProvider lifecycleProvider) {
        this.mLifecycleProvider = new SoftReference(lifecycleProvider);
    }

    /**
     * 处理http请求
     *
     * @param observable 封装的请求数据
     */
    public Observable doHttpDeal(Observable observable) {
        /*rx处理*/
        return observable
        /*失败后的retry配置*/
                .retryWhen(new RetryWhenNetworkException())
        /*异常处理*/
                .onErrorResumeNext(funcException)
        /*生命周期管理*/
                .compose(mLifecycleProvider.get().bindToLifecycle())
        /*http请求线程*/
                .subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
        /*回调线程*/
                .observeOn(AndroidSchedulers.mainThread());
        /*结果判断*/
    }


    /**
     * 异常处理
     */
    Function funcException = (Function<Throwable, Observable>) throwable ->
            Observable.error(FactoryException.analysisExcetpion(throwable));

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值