android 应用中动态切换baseUrl

781 阅读1分钟

首先,为每一个请求url添加一个自定义的header信息,再创建一个拦截器(Interceptor),通过拦截器来获取每个url中携带的我们自定义的header信息,来为已经区分的url替换不同的baseUrl。

首先看下Retrofit的创建:

public Retrofit buildRetrofit() {
        if (mRetrofit == null) {
            mRetrofit = new Retrofit.Builder()
                    .baseUrl(Constant.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .client(
                            builder.addInterceptor(new HeaderInterceptor())
                                    .addInterceptor(new MoreBaseUrlInterceptor())
                                    .build()
                    )
                    .build();
        }
        return mTongZhouRetrofit;
    }
    //重点
    .addInterceptor(new MoreBaseUrlInterceptor())

这个 MoreBaseUrlInterceptor 就是最重要的一环,再往里看:

public class MoreBaseUrlInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        HttpUrl oldUrl = request.url();
        Request.Builder builder = request.newBuilder();
        List<String> urlNameList = request.headers("urlname");
        if (urlNameList != null && urlNameList.size() > 0) {
            builder.removeHeader("urlname");
            String urlName = urlNameList.get(0);
            HttpUrl baseURL = null;
            if ("need_change".equals(urlName)) {
            //获取到被标记可替换baseUrl的请求url
                if (MyApp.getInstance().getDataManager().getCurrentRelease() == 0) {
                    //再通过获取当前的版本,来设置对应的baseUrl
                    baseURL = HttpUrl.parse(Constant.EXTRANET_URL);
                } else {
                    baseURL = HttpUrl.parse(Constant.INTRANET_URL);
                }
            }
//            else if ("".equals(urlname)) {
//                baseURL = HttpUrl.parse("");
//            }

            //重建新的HttpUrl,需要重新设置的url部分
            HttpUrl newHttpUrl = oldUrl.newBuilder()
                    .scheme(baseURL.scheme())//http协议如:http或者https
                    .host(baseURL.host())//主机地址
                    .port(baseURL.port())//端口
                    .build();
//            String header = request.header("NoToken");
//            if (header == null) {
//                builder.addHeader("Cookie", UserUtils.getCokeValue())
//                        .addHeader("Content-Type", "application/x-www-form-urlencoded")
//                        .addHeader("X-Requested-With", "XMLHttpRequest");
//            }

            //获取处理后的新newRequest
            Request newRequest = builder.url(newHttpUrl).build();
            KLog.i("处理后的request :" + newHttpUrl.url());
            return chain.proceed(newRequest);
        }

        return chain.proceed(request);
    }

还有最后一步,在需要切换baseUrl的请求url上添加自定义的header:

    @GET("xxx")
    @Headers("urlname:need_change")
    @ResponseFormat(ResponseFormat.JSON)
    Observable getBody();

这样就结束了,总结一下: 1、在需要切换baseUrl的请求url上添加自定义的header 2、编写拦截器 3、添加拦截器