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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值