okhttp配合retrofit实现baseurl动态切换

在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地址。

猜你喜欢

转载自blog.csdn.net/qq_36356379/article/details/110085556
今日推荐