一、Retrofit+Rxjava结合获取服务器返回字符串
主要解决:参数的传递需要加密后发送到服务器,服务器返回的数据也是加密后的字符串。因此需要拿到服务器返回的加密字符串,进行解密,然后进行将解密后的json字符串进行解析成相应的实体类
以下不管使用哪个方法:.addConverterFactory(GsonConverterFactory.create(getGson()))
这个GsonConverterFactory都不能添加。要注释掉。
方法一
1、在ApiStore中,使用rxjava包装返回的类型写成ResponseBody。Observable loginIn();
2、使用Rxjva订阅返回的addSubscription中。通过返回的ResponseBody body。String resPonseStr=body.string即为服务器返回的字符串。再通过解密工具类,json字符串转实体类工具类进行转换,再通过mvpview将解析好的实体返回对应的界面。
方法二
1、方法1的缺点。这样每个接口请求成功后都要通过解密工具类,json字符串转实体类工具类进行转换。这样就要写好多次
2、我就想有什么办法可以统一解密,解析的吗。这样写一次就够了
3、发现我们可以自定义GsonConverterFactory。将我们需要处理的进行统一处理
自定义GsonConverterFactory
4、由于GsonConverterFactory涉及的类都是final。不可以重写。那我们就只能新建目录,把源码拷贝过来
5、新建包:retrofit2.converter.gson。因为GsonConverterFactory中包含GsonRequestBodyConverter是在这个包下,不然我们还需要多拷贝这个类过来。不闲麻烦,你可以再新建这个类进行拷贝
6、在新建的包下面:新建类CustomResponseConverter。 @Override public T convert(ResponseBody value){}在这个函数中,将返回的ResponseBody进行统一处理,你想怎么处理怎么处理。
7、在新建的包下面:新建类CustomConverterFactory。将其中的GsonResponseBodyConverter替换成你刚才自定义的CustomResponseConverter即可
8、使用:将原来注释掉的.addConverterFactory(GsonConverterFactory.create(getGson()))换成
.addConverterFactory(CustomConverterFactory.create(getGson()))这样就会自动处理所有的接口啦!
二、代码结构以及展示
此图展示的是建立好的包名下的自定义的两个类
1、CustomConverterFactory.class
public class CustomResponseConverterimplementsConverter {
private finalGsongson;
private finalTypeAdapteradapter;
public CustomResponseConverter(Gson gson,TypeAdapter adapter) {
this.gson= gson;
this.adapter= adapter;
}
@Override public T convert(ResponseBody value)throwsIOException {
try{
String valeStr = value.string();
String body = UHttpSecret.GetDecodeText(valeStr, true);
JSONObject json =newJSONObject(body);
intret = json.optInt("FLAG");
String msg = json.optString("MESSAGE","");
if(ret ==0) {
returnadapter.fromJson(body);
}else{
throw newRuntimeException(msg);
}
}catch(Exception e) {
throw newRuntimeException(e.getMessage());
}finally{
value.close();
}
}
}
2、CustomConverterFactory.class
public final classCustomConverterFactoryextendsConverter.Factory {
public staticCustomConverterFactorycreate() {
returncreate(newGson());
}
public staticCustomConverterFactorycreate(Gson gson) {
return newCustomConverterFactory(gson);
}
private finalGsongson;
privateCustomConverterFactory(Gson gson) {
if(gson ==null)throw newNullPointerException("gson == null");
this.gson= gson;
}
@Override
publicConverterresponseBodyConverter(Type type,Annotation[] annotations,
Retrofit retrofit) {
TypeAdapter adapter =gson.getAdapter(TypeToken.get(type));
return newCustomResponseConverter<>(gson,adapter);
}
@Override
publicConverterrequestBodyConverter(Type type,
Annotation[] parameterAnnotations,Annotation[] methodAnnotations,Retrofit retrofit) {
TypeAdapter adapter =gson.getAdapter(TypeToken.get(type));
return newGsonRequestBodyConverter<>(gson,adapter);
}
}