主要思路是请求url时加个请求头,然后在拦截器里通过本次请求的请求头来判断使用对应的baseUrl。

主要代码

import com.xxx.xxx.MyClient;import java.io.IOException;import java.util.List;import okhttp3.HttpUrl;import okhttp3.Interceptor;import okhttp3.Request;import okhttp3.Response;public class MulBaseUrlInterceptor implements Interceptor {    public MulBaseUrlInterceptor() {    }    @Override    public Response intercept(Chain chain) throws IOException {        Request request = chain.request();        //获取处理后的新newRequest        Request newRequest;        //获取老的url        HttpUrl oldUrl = request.url();        //获取originalRequest的创建者builder        Request.Builder builder = request.newBuilder();        // 获取头信息的集合        List<String> urlTypeList = request.headers(MyClient.URL_TYPE_KEY);        if (urlTypeList != null && urlTypeList.size() > 0) {            //删除原有配置中的值,就是namesAndValues集合里的值            builder.removeHeader(MyClient.URL_TYPE_KEY);            //获取头信息中配置的value            String headerValueFirst = urlTypeList.get(0);            //根据头信息中配置的value,来匹配新的base_url地址            HttpUrl baseURL = null;            //重建新的HttpUrl,需要重新设置的url部分            String oldUrlStr = oldUrl.toString();            String oldUrlHost = oldUrl.host();            int oldUrlHostIndex = oldUrlStr.indexOf(oldUrlHost);            int oldUrlStrLength = oldUrlHost.length();            switch (headerValueFirst) {                case MyClient.URL_TYPE_VALUE_MIDDLE: // 第一种                    baseURL = HttpUrl.parse(MyClient.getMiddleUrl() + oldUrlStr.substring(oldUrlHostIndex + oldUrlStrLength+1));                    break;                case MyClient.URL_TYPE_VALUE_TASK: // 第二种                    baseURL = HttpUrl.parse(MyClient.getTaskUrl() + oldUrlStr.substring(oldUrlHostIndex + oldUrlStrLength+1));                    break;                case MyClient.URL_TYPE_VALUE_BASE: // 第三种                    baseURL = HttpUrl.parse(MyClient.getStorageUrl() + oldUrlStr.substring(oldUrlHostIndex + oldUrlStrLength+1));                    break;            }            if (baseURL != null) {                newRequest = builder.url(baseURL).build();            } else {                newRequest = request;            }        } else {            newRequest = request;        }        Response response = chain.proceed(newRequest);        return response;    }}

第二步,使用这个拦截器

  • addInterceptor(new MulBaseUrlInterceptor())即可
private static Retrofit getMyRetrofit() {        SSLSocketFactory sslSocketFactory = getSSLSocketFactory();        if(retrofit == null) {            okHttpClient = sOkHttpBuilder                    .readTimeout(60L, TimeUnit.SECONDS)// 读取超时                    .writeTimeout(60L, TimeUnit.SECONDS)// 写入超时                    .connectTimeout(60L, TimeUnit.SECONDS)// 连接超时                    .addInterceptor(new XxxInterceptor())                    .addInterceptor(new XxxInterceptor(1))                    .addInterceptor(new MulBaseUrlInterceptor())                    .sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0])                    .hostnameVerifier(new HostnameVerifier() {                        @Override                        public boolean verify(String hostname, SSLSession session) {                            return true;                        }                    })                    .build();            retrofit = new Retrofit.Builder()                    .baseUrl(getOperationUrl())                    .client(okHttpClient)                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())                    .addConverterFactory(GsonConverterFactory.create())                    .build();        }        return retrofit;    }

更多相关文章

  1. Android(安卓)撕衣服Demo(OnTouchListener 应用)
  2. Android获取摄像头视频帧并实时处理(转载)
  3. native.js获取手机硬件基本信息实例代码android版
  4. android 中downloadmanager学习
  5. delphixe 安卓 android操作 打电话,摄像头,定位等
  6. Android获取通讯录联系人显示在EditText上Demo
  7. android 利用getIdentifier()获取资源
  8. Android音频处理学习之MediaExtractor获取aac文件后添加ADTS头
  9. 【Android】获取应用程序(包)的信息-----PackageManager的使用(

随机推荐

  1. Android(安卓)日历开发教程[四]
  2. Android坐标系分析
  3. 【Android系列】—Android世界全景观
  4. 18、ESC/POS指令集在android设备上使用实
  5. Android扫车牌号识别技术SDK
  6. Android中的时间自动更新
  7. Android对Linux内核的改动你知道多少
  8. 在你的android设备运行java web应用程序
  9. Android内存管理
  10. 丢失Android系统库或者Conversion to Dal