三默网为您带来有关“okhttp配合retrofit实现baseurl动态切换”的文章内容,供您阅读参考。
okhttp配合retrofit实现baseurl动态切换
2023-01-21 19:34:22
在okhttp+retrofit+rxjava网络框架中,基本都是配置了baseurl,正常来讲一个安卓项目baseurl是固定不变的,但是在有些情况下,baseurl可能需要改变,这就需要我们在项目中动态的去修改baseurl。
一、分析
this.mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//使用rxjava
.addConverterFactory(GsonConverterFactory.create())//使用Gson
.client(mOkHttpClient)
.build();
retrofit在创建的时候就指明了baseurl,如果修改baseurl的话其实可以创建新的retrofit实例,但是如果每切换一次baseurl就创建一次实例显然是不太好的。试想一下我们可以在retrofit注解里配置header,然后在okhttp拦截器里拦截这个配置去动态修改request请求就可以了。
二、实现
首先创建一个HashMap,用于存放项目中所用到的所有的baseurl,
private HashMap<String,String> hashMap = new HashMap<>();
//方便测试随便写的
hashMap.put("one","https://juejin.cn/android/");
hashMap.put("two","https://www.jianshu.com/");
//OkHttpClient的拦截器,用于拦截retrofit里header的配置
Interceptor interceptor = new Interceptor() {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
Request request = chain.request();
Request.Builder builder = request.newBuilder();
//拦截retrofit注解的header配置信息
List<String> list = request.headers("baseUrl");
if(list.size()>0) {
//移除掉header 因为服务器不需要这个header,这个header只是在拦截器里用到
builder.removeHeader("baseUrl");
String key = list.get(0);
//如果配置的header信息在HashMap里有声明
if(!TextUtils.isEmpty(key) && hashMap.containsKey(key)) {
HttpUrl newBaseUrl = HttpUrl.get(hashMap.get(key));
HttpUrl oldBaseUrl = request.url();
//将旧的请求地址里的协议、域名、端口号替换成配置的请求地址
HttpUrl newFullUrl = oldBaseUrl.newBuilder().
scheme(newBaseUrl.scheme()).
host(newBaseUrl.host()).
port(newBaseUrl.port()).build();
//创建带有新地址的新请求
Request newRequest = builder.url(newFullUrl).build();
return chain.proceed(newRequest);
}
}
return chain.proceed(request);
}
};
三、使用方法
@Headers("baseUrl:two")
@GET("user/getStudent")
Observable<BaseResBean<UserBean>> getUserInfo(@QueryMap HashMap<String, Object> map);
@Headers(“baseUrl:two”) okhttp通过key为baseUrl,获取到two,然后根据这个two去hashmap里就能找到对应的url,拦截器将默认的请求修改成新的请求地址就可以了。如果retrofit没有配置该注解的话,okhttp的请求地址就是在创建retrofit时传入的baseurl地址。