retrofit合理的处理response

OKHttp + retrofit 有时候使用起来确实会受到一些局限

比如:
处理response的加解密
处理response的返回的字段与本地封装的不一样(又不能改本地的字段,所以需要对返回的JSON进一步处理(别名的方式))
处理response的JSON
比如:

           [
                    {""},
                    {""}
           ]

会发现服务器放回的没有KEY,遇到这样的情况该如何处理呢?
我采用的方式是,强行在json前面添加了一个key
最后变成了

{
    "jsonBean":
    [
        {
            ""
        },
        {
            ""
        }
    ]
}   

//自己写了组装类

public class JsonWrapperHelper {
    public static String getWrapperJson(String jsonString){
        StringBuilder builder = new StringBuilder();
        builder.append("{\"jsonBean\":").append(jsonString).append("}");
        return builder.toString();
    }
}

铺垫这么多总之一句话,就是如何在retrofit中去间接处理response,
又不失其优雅(当然你可以在OKHTTP中添加拦截器,但是使用了retrofit后,不推荐这么做)
好了开始正式进去主题 了
首先我们都知道retrofit中有个工厂,可以自己去添加工厂

 addConverterFactory(xxxxx)
    没错我们自己去自定义一个 XXXX:GsonConverterFactory.create()

首先把GsonConverterFactory.create() 先关的类复制一份
    分别是
        CustomGsonConverterFactory
        GsonResponseBodyConverter<T>
        GsonRequestBodyConverter<T>

    我们自己再去修改里面关键代码
    这里是我们组装的 解析工厂
        CustomGsonConverterFactory
        CustomGsonRequestBodyConverter
        CustomGsonResponseBodyConverter

    这里我只说一个案例
            对response的解析结果进行处理
                CustomGsonRequestBodyConverter       

GsonResponseBodyConverter源码:

final class GsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
  private final Gson gson;
  private final TypeAdapter<T> adapter;

  GsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {
    this.gson = gson;
    this.adapter = adapter;
  }

  @Override public T convert(ResponseBody value) throws IOException {
    JsonReader jsonReader = gson.newJsonReader(value.charStream());
    try {
      return adapter.read(jsonReader);
    } finally {
      value.close();
    }
  }
}
这里就是GsonConverterFactory处理的返回结果的方法
我在这里进行的包装处理
因为我不想对GsonResponseBodyConverter 进行一个整体的破坏,,于是自己创建了一个StringReader,把我们包装后的json设置进去就可以了
当然在这里可以处理解密操作
public class CustomGsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
    private final Gson gson;
    private final TypeAdapter<T> adapter;

    CustomGsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {
        this.gson = gson;
        this.adapter = adapter;
    }

    @Override
    public T convert(ResponseBody value) throws IOException {
        String jsonBean = JsonWrapperHelper.getWrapperJson( value.string());
        Reader mRead = new StringReader(jsonBean);
        JsonReader jsonReader = gson.newJsonReader(mRead);
        try {
            return adapter.read(jsonReader);
        } finally {
            value.close();
        }
    }
}

当然以上只是一个案例而已,你也可以根据自己的项目去创建不同的read
这里写图片描述

题外话,其实针对服务器数据结构的处理还有一种更佳好的解决方案,学习之后可以说解决了你与服务器后台数据之间的代沟:
clean架构( DTO—>VO)
你有可能觉得一脸懵逼
没事来看看这篇你就明白了
clean(c/p)链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值