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)链接