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


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

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

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

    前提:

    网络库使用的是okhttp或Retrofit。

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

    1、addInterceptor(new MockDataInterceptor()):

    1. OkHttpClient.Builder builder = new OkHttpClient.Builder();
    2. builder.connectTimeout(15, TimeUnit.SECONDS)
    3. .readTimeout(15, TimeUnit.SECONDS)
    4. .writeTimeout(15, TimeUnit.SECONDS)
    5. //在此处添加MockDataInterceptor拦截即可
    6. .addInterceptor(new MockDataInterceptor())
    7. .retryOnConnectionFailure(false);

     2、MockDataInterceptor定义如下:

    1. /**
    2. * Mock数据拦截器
    3. */
    4. public class MockDataInterceptor implements Interceptor {
    5. private static final String TAG = "MockDataInterceptor";
    6. //是否开启mock数据
    7. private static final boolean mockIsOpen = true;
    8. private String path;
    9. private static Map pathMap;
    10. @Override
    11. public Response intercept(Chain chain) throws IOException {
    12. Request request = chain.request();
    13. Response response = chain.proceed(request);
    14. Headers headers = response.request().headers();
    15. if (shouldInterceptorRequest(request) && mockIsOpen) {
    16. //查看Headers请求参数
    17. Log.d(TAG, "headers:" + headers);
    18. //查看原始responseBody数据
    19. Response.Builder builder = response.newBuilder();
    20. if (response.body() != null) {
    21. String originalBody = response.body().string();
    22. Log.d(TAG, "原始的 responseBody:" + originalBody);
    23. }
    24. if (!TextUtils.isEmpty(getMockData())) {
    25. //为responseBody赋值[mock数据]
    26. ResponseBody responseBody = ResponseBody.create(MediaType.parse("application/json; charset=utf-8"), getMockData());
    27. builder.body(responseBody);
    28. Log.d(TAG, "mock数据后 responseBody:" + getMockData());
    29. }
    30. return builder.build();
    31. } else {
    32. return response;
    33. }
    34. }
    35. //获取对应的mock数据
    36. private String getMockData() {
    37. for (String key : pathMap.keySet()) {
    38. if (path.contains(key)) {
    39. return pathMap.get(key);
    40. }
    41. }
    42. return "";
    43. }
    44. //在此处添加被拦截的接口判断
    45. private boolean shouldInterceptorRequest(Request request) {
    46. path = request.url().url().getPath();
    47. for (String key : pathMap.keySet()) {
    48. if (path.contains(key)) {
    49. Log.d(TAG, "path:" + path);
    50. return true;
    51. }
    52. }
    53. return false;
    54. }
    55. public static final String MOCK_DATA_APP_***_*HECK = "{\n" +
    56. " \"resMsg\":{\n" +
    57. " \"code\":0,\n" +
    58. " \"message\":\"\\u6210\\u529f\"\n" +
    59. " },\n" +
    60. " \"datas\":{\n" +
    61. " \"type\":1,\n" +
    62. " \"title\":\"\标题",\n" +
    63. " \"content\":\"哈哈哈",\n" +
    64. " \"url\":\"\"\n" +
    65. " }\n" +
    66. "}";
    67. //将对应的接口path及该接口mock数据添加到pathMap中
    68. static {
    69. pathMap = new HashMap<>();
    70. pathMap.put("app****heck", MOCK_DATA_APP_***_*HECK);
    71. }
    72. }

    使用前需注意:

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

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

  • 相关阅读:
    我是真没想到,这个面试题居然从11年前就开始讨论了,而官方今年才表态。
    算法-具有所有最深节点的最小子树(Kotlin)
    【C语言】21-指针-3
    nuc980学习笔记7-设置开机自启动
    #ACCV2022还有两周截稿#疫情过后期待相聚澳门,相邀参与亚洲视觉盛会
    【C语言】你还不会指针吗?不妨来一起攻克指针这个难点
    python-opencv划痕检测-续
    2023学年持IB成绩申请NTU入学流程指南
    2006-2019年全国30省绿色创新效率、绿色投资效率:基于SBM-DEA测算面板数据(数据+Stata代码)
    人生进步法则-提问法则
  • 原文地址:https://blog.csdn.net/u012440207/article/details/127408857