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
- retrofit合理的处理response
- Retrofit--合理封装回调能让你的项目高逼格
- Retrofit--合理封装回调能让你的项目高逼格
- Retrofit--合理封装回调
- Retrofit response 回调封装
- Server.Transfer替代Response.Redirect的合理用法--微软的建议(downmoon)
- 设计一个高效合理的异常处理框架
- [转]设计一个高效合理的异常处理框架
- 设计一个高效合理的异常处理框架
- Rxjava+Retrofit嵌套处理请求,并优雅的处理异常
- JS处理服务端Response回来的数组
- Response对象响应的中文乱码处理
- Retrofit请求,返回response时报错
- Retrofit请求数据对错误以及网络异常的处理
- Retrofit+RxJava 优雅的处理服务器返回异常、错误
- Retrofit请求数据对错误以及网络异常的处理
- Retrofit+RxJava 优雅的处理服务器返回异常、错误
- RxJava结合Retrofit对网络请求结果的统一处理
- 隐藏软键盘出现的error
- 最佳实践:更好的设计你的 REST API
- 简单的图中循环删除算法
- Mac 如何配置使用ADB
- 滑动冲突处理
- retrofit合理的处理response
- 【b601】能量项链
- Java代理模式1 - 静态代理、动态代理
- 更新libcurl后yum命令报错
- oracle_事务
- 嵌入式物联网
- 液晶驱动芯片分类
- 判断字符串中的数字是否相同,连续
- JAVA回调机制