關於Retrofit 動態修改BaseUrl 操做

image

原理就是新建攔截器,newBuilder.url(newUrl).build() 修改HttpUrljson

操做以下:

  1. 新建攔截器
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();
    }
}
複製代碼
  1. 在Retrofit Build()以前 調用 interceptor.putUrl(tag, url);
//這裏的tag是第三步中接口頭部設置API_DOMAIN_NAME,url就是baseUrl。
public void putUrl(String tag, String url) {
    //interceptor就是baseUrl修改攔截器
    this.interceptor.putUrl(tag, url);
  }
複製代碼
  1. 在請求接口中添加頭
/**
   * 獲取用戶信息.
   *
   * @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

相關文章
相關標籤/搜索