Android已封装好的Retrofit网络框架如何断点获取原始的json

最近在项目中遇到一个问题,相信大部分人都会遇到,先说下问题出现的情况,我项目的网络框架用的是Retrofit+Rxjava+Okhttp,一般我们封装Retrofit网络请求接口的Serivce时都会定义好动态编译泛型,如:

   @POST("realTimeProtectionService/findMapInfo")
   Observable> findMapInfo(@QueryMap Map map);
在观察者的onNext方法返回泛型,如:

    @Override
    public void onNext(T t) {
        listener.onNext(t);
    }
然后在对应的P层获取listener的回调,然后强转成我们需要的实体类型,如:
mModel.Subscribe(mContext, Api.getApiService().findMapInfo(loginMap), new ObserverOnNextListener() {
            @Override
            public void onNext(Object o) {
                KLog.e("-------------------- onNext --------------------");
                getView().result((Cmd) o);
            }
        });
。。。。。。。。。。。但是,我们有个问题,这样封装完全没问题,但是如果我们想要打印出返回的数据,怎么办?你说找后台给返回样例,可以。但如果你遇到的是一个半吊子后台或者别人很忙,或者脾气很大的人让你自己解决,你能怎么办。或者换一种情况,后台接口数据字段换了,让你自己修改下,说这种小问题让你自己解决,你还不是只有自己想办法。作为一个合格的程序员肯定得找方法啊。

你说可以用Okhttp里面的日志拦截器啊,我想说如果你的返回数据超过一行呢,此时拦截器会是这样的,

Android已封装好的Retrofit网络框架如何断点获取原始的json_第1张图片

此时你复制出来的数据会因为拦截器超过一行而丢失部分字段。故这种方法在数据量较大时行不通。

那么我们再思考一下,Okhttp中的Response是不是包含返回信息的json字段。好,找到入口点,那么我们想办法让观察者返回Response。我们知道Retrofit的Call对象返回的数据是基于动态编译的,也就是在运行阶段就编译好的,所以我们不能在收到实体结果后再来转成我们想要的json结果,所以我们在Call传的泛型必须是Okhttp的ResponseBody,

兜风

此时我们观察者回调到P层得到的数据还是为ResponseBody类型的(表现为Object),此时我们强转成ResponseBody,此时调用ResponseBody的string方法返回json字符串,

Android已封装好的Retrofit网络框架如何断点获取原始的json_第2张图片

然后断点此行,copy value,拿到json值。当解析完你的数据格式之后再还原你的Call<>里面的泛型即可。完成。。。

Android已封装好的Retrofit网络框架如何断点获取原始的json_第3张图片




你可能感兴趣的:(开发中遇到的问题)