主要思路是請求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;
}