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

本文介绍了一种在使用Retrofit+RxJava+OkHttp框架进行网络请求时的有效调试方法,通过将返回类型更改为OkHttp的ResponseBody,实现了对响应数据的完整查看与调试。

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

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

   @POST("realTimeProtectionService/findMapInfo")
   Observable<Cmd<PersonRealTime>> findMapInfo(@QueryMap Map<String, String> 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<PersonRealTime>) o);
            }
        });
。。。。。。。。。。。但是,我们有个问题,这样封装完全没问题,但是如果我们想要打印出返回的数据,怎么办?你说找后台给返回样例,可以。但如果你遇到的是一个半吊子后台或者别人很忙,或者脾气很大的人让你自己解决,你能怎么办。或者换一种情况,后台接口数据字段换了,让你自己修改下,说这种小问题让你自己解决,你还不是只有自己想办法。作为一个合格的程序员肯定得找方法啊。

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

。

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

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

兜风

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

玩儿

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

。。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值