retrofit合理的处理response

来源:互联网 发布:天正制图软件 编辑:程序博客网 时间:2024/06/05 02:41

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

0 0
原创粉丝点击