原理就是新建攔截器,newBuilder.url(newUrl).build() 修改HttpUrljson
public class MultipleUrlInterceptor implements Interceptor {
private final Map<String, String> urls = new HashMap();
private UrlParser urlParser;
private boolean isRun = true;
public MultipleUrlInterceptor() {
this.initUrlParser(new DefaultUrlParser());
}
private void initUrlParser(UrlParser urlParser) {
this.urlParser = urlParser;
}
public void putUrl(String tag, String url) {
Map var3 = this.urls;
synchronized(this.urls) {
this.urls.put(tag, url);
}
}
public Response intercept(Chain chain) throws IOException {
return !this.isRun()?chain.proceed(chain.request()):chain.proceed(this.processRequest(chain.request()));
}
public Request processRequest(Request request) {
Builder newBuilder = request.newBuilder();
String url = HttpUtils.obtainValueFromHeaders("api", request);
if(TextUtils.isEmpty(url)) {
String urlTag = HttpUtils.obtainValueFromHeaders("Domain-Name", request);
if(TextUtils.isEmpty(urlTag)) {
return newBuilder.build();
}
newBuilder.removeHeader("Domain-Name");
url = (String)this.urls.get(urlTag);
}
HttpUrl httpUrl = null;
if(!TextUtils.isEmpty(url)) {
try {
newBuilder.removeHeader("api");
httpUrl = UrlUtils.createHttpUrl(url);
} catch (InvalidUrlException var6) {
var6.printStackTrace();
}
}
if(null != httpUrl) {
HttpUrl newUrl = this.urlParser.parseUrl(httpUrl, request.url());
return newBuilder.url(newUrl).build();
} else {
return newBuilder.build();
}
}
public boolean isRun() {
return this.isRun;
}
public void setRun(boolean run) {
this.isRun = run;
}
}
//重置httpurl接口
public interface UrlParser {
HttpUrl parseUrl(HttpUrl var1, HttpUrl var2);
}
//重置httpurl實現類
public class DefaultUrlParser implements UrlParser {
public DefaultUrlParser() {}
public HttpUrl parseUrl(@NonNull HttpUrl domainUrl, @NonNull HttpUrl url) {
return null == domainUrl?url:url.newBuilder().scheme(domainUrl.scheme()). host(domainUrl.host()).port(domainUrl.port()).build();
}
}
複製代碼
//這裏的tag是第三步中接口頭部設置API_DOMAIN_NAME,url就是baseUrl。
public void putUrl(String tag, String url) {
//interceptor就是baseUrl修改攔截器
this.interceptor.putUrl(tag, url);
}
複製代碼
/**
* 獲取用戶信息.
*
* @param fieldMap the field map
* @return
* public static final String DOMAIN_NAME_HEADER = "Domain-Name: "; 這個是第二步中的tag參數
* public static final String API_DOMAIN_NAME = "api";這個是第二步中的tag參數名
*/
@Headers({"Content-type:application/json;charset=UTF-8", DOMAIN_NAME_HEADER + API_DOMAIN_NAME})
@POST("/api/app")
Observable<BaseResponse<UserInfo>> getUserInfo(@Body RequestBody fieldMap);
複製代碼
到這裏,動態替換baseUrl的操做就結束了api