使用retrofit处理网络请求时,通常解析的结果是通过GsonConverterFactory或者是其他的Jackson之类的解析器来处理Json对象的解析。遇到需要解密的时候,先看返回的数据:
{"retCode":200,"retDesc":"Success","ret":xxxxxx}
ret里存放的是加密过的数据。
两种套路:
一. 自定义Converter
.addConverterFactory(MyConverterFactory.create())
通常可以处理将所有的请求的返回全部进行解密,如果我们要根据请求去判断是否解密,因为在Converter里无法获取到Reqest和Response对象,所有如何判断这个接口请求是否需要解密结果是个问题。
二.将对象解析成json后处理加密的ret
结合RxJava使用map转换。
使用注解
public interface GitHubService {
@GET("users/{user}/repos")
Call> listRepos(@Path("user") String user);
}
Retrofit构造请求时,使用了注解@GET,再看看Converter里的代码
发现参数里返回里传了annotations数组,所以,遍历它吧,里面包含了所有你写请求时加的注解
@Override
public Converter responseBodyConverter(Type type, Annotation[] annotations, Retrofitretrofit) {
boolean encryt = false;
for (int i = 0; i < annotations.length; i++) {
if (annotations[i].annotationType().toString().equals(ENCRYT.class.toString())) {
encryt = true;
}
}
return new MyResponseBodyConverter<>(gson, type, encryt);
}
自定义一个注解@XXX,请求时写上标记你的请求类型,加密。
然后你就可以在Converter里处理了。
个人浅见,欢迎批评!