第一步、在service代码中添加@Headers():
@Headers("urlname:test1")
@GET("地址1")
Observable
@Headers("urlname:test2")
@GET("地址2")
Observable
主要是添加headers请求头,按照urlname(可改):url 键值对的形式去说明
第二步、添加okhttpclient拦截器,捕获添加的Headers,然后修改baseURL
public class BaseUrlInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
//获取request
Request request = chain.request();
//从request中获取原有的HttpUrl实例oldHttpUrl
HttpUrl oldHttpUrl = request.url();
//获取request的创建者builder
Request.Builder builder = request.newBuilder();
//从request中获取headers,通过给定的键url_name
List
if (headerValues != null && headerValues.size() > 0) {
//如果有这个header,先将配置的header删除,因此header仅用作app和okhttp之间使用
builder.removeHeader("urlname");
//匹配获得新的BaseUrl
String headerValue = headerValues.get(0);
HttpUrl newBaseUrl = null;
if ("test1".equals(headerValue)) {
newBaseUrl = HttpUrl.parse(BASE_URL1);
}else if ("test2".equals(headerValue)) {
newBaseUrl = HttpUrl.parse(BASE_URL2);
}else{
newBaseUrl = oldHttpUrl;
}
//重建新的HttpUrl,修改需要修改的url部分
HttpUrl newFullUrl = oldHttpUrl
.newBuilder()
.scheme("https")//更换网络协议
.host(newBaseUrl.host())//更换主机名
.port(newBaseUrl.port())//更换端口
.removePathSegment(0)//移除第一个参数
.build();
//重建这个request,通过builder.url(newFullUrl).build();
// 然后返回一个response至此结束修改
Log.e("Url", "intercept: "+newFullUrl.toString());
return chain.proceed(builder.url(newFullUrl).build());
}
return chain.proceed(request);
}
}
以上是实际代码处理
第三步、在okhttpclient中设置
//创建一个OkHttpClient并设置超时时间
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(READ_TIME_OUT, TimeUnit.MILLISECONDS)
.connectTimeout(CONNECT_TIME_OUT, TimeUnit.MILLISECONDS)
.addInterceptor(mRewriteCacheControlInterceptor)//没网的情况下
.addNetworkInterceptor(mRewriteCacheControlInterceptor)//有网的情况下
.addInterceptor(new BaseUrlInterceptor())
.addInterceptor(logInterceptor)
.cache(cache)
.build();
实际就是添加了拦截器,最后需要将okhttp设置进去Retrofit中。
文章引用https://blog.csdn.net/li18518326892/article/details/86640881