首先,为每一个请求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、添加拦截器