Android OkHttp/Retrofit框架使用Interceptor 抓包/mock数据

在Android业务开发中,抓包/mock数据一般有两种方案 (该篇主要介绍第种方案):

一、通过Charles(或fiddle)抓包/mock数据:

二、添加Intercepter来抓取/mock数据:

前提:

网络库使用的是okhttp或Retrofit。

这里就用到了okhttp框架的原理定义一个MockDataInterceptor【Mock数据拦截器】,并在创建Builder实例的时候直接使用addIntercepter【应用拦截器】添加MockDataInterceptor实例即可:

1、addInterceptor(new MockDataInterceptor()):

java 复制代码
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(15, TimeUnit.SECONDS)
       .readTimeout(15, TimeUnit.SECONDS)
       .writeTimeout(15, TimeUnit.SECONDS)
       //在此处添加MockDataInterceptor拦截即可
       .addInterceptor(new MockDataInterceptor())
       .retryOnConnectionFailure(false);

2、MockDataInterceptor定义如下:

java 复制代码
/**
 * Mock数据拦截器
 */
public class MockDataInterceptor implements Interceptor {

    private static final String TAG = "MockDataInterceptor";
    //是否开启mock数据
    private static final boolean mockIsOpen = true;
    private String path;

    private static Map<String, String> pathMap;

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Response response = chain.proceed(request);
        Headers headers = response.request().headers();
        if (shouldInterceptorRequest(request) && mockIsOpen) {
            //查看Headers请求参数
            Log.d(TAG, "headers:" + headers);

            //查看原始responseBody数据
            Response.Builder builder = response.newBuilder();
            if (response.body() != null) {
                String originalBody = response.body().string();
                Log.d(TAG, "原始的 responseBody:" + originalBody);
            }

            if (!TextUtils.isEmpty(getMockData())) {
                //为responseBody赋值[mock数据]
                ResponseBody responseBody = ResponseBody.create(MediaType.parse("application/json; charset=utf-8"), getMockData());
                builder.body(responseBody);
                Log.d(TAG, "mock数据后 responseBody:" + getMockData());
            }
            return builder.build();
        } else {
            return response;
        }
    }

    //获取对应的mock数据
    private String getMockData() {
        for (String key : pathMap.keySet()) {
            if (path.contains(key)) {
                return pathMap.get(key);
            }
        }
        return "";
    }

    //在此处添加被拦截的接口判断
    private boolean shouldInterceptorRequest(Request request) {
        path = request.url().url().getPath();

        for (String key : pathMap.keySet()) {
            if (path.contains(key)) {
                Log.d(TAG, "path:" + path);
                return true;
            }
        }
        return false;
    }


    public static final String MOCK_DATA_APP_***_*HECK = "{\n" +
            "    \"resMsg\":{\n" +
            "        \"code\":0,\n" +
            "        \"message\":\"\\u6210\\u529f\"\n" +
            "    },\n" +
            "    \"datas\":{\n" +
            "        \"type\":1,\n" +
            "        \"title\":\"\标题",\n" +
            "        \"content\":\"哈哈哈",\n" +
            "        \"url\":\"\"\n" +
            "    }\n" +
            "}";

    //将对应的接口path及该接口mock数据添加到pathMap中
    static {
        pathMap = new HashMap<>();
        pathMap.put("app****heck", MOCK_DATA_APP_***_*HECK);
    }
}

使用前需注意:

  • mock开关是打开的mockIsOpen = true;
  • pathMap中已添加所需的接口path及mock数据。

这样就可以愉快的抓包及mock数据了。

相关推荐
光电的一只菜鸡11 小时前
为什么调整LSC会对AF产生影响
android·开发语言·kotlin
凛_Lin~~11 小时前
LiveData 源码解析
android·安卓·livedata
hai_android12 小时前
FusibleFlow:Kotlin Flow 的融合机制原理
android·kotlin
龚寿生12 小时前
23-敏捷开发实战:从Scrum到看板的团队协作方法论
android·学习·scrum·敏捷流程
zhangguojia713 小时前
Activity启动流程(四):从setContentView到View树创建与Window挂载
android
三少爷的鞋16 小时前
Kotlin 2026:裁员、AI、Rust——黄金时代结束了吗?Jake Wharton 为你解答
android
alexhilton16 小时前
从零开始的架构测试套件
android·kotlin·android jetpack
finhaz17 小时前
台电x98plus在安卓x86的使用
android·平板·安卓x86
事圆则缓17 小时前
遗留项目改造实战指南:从可读性、代码质量到性能和 AI 约束
android·ai·代码规范