关于Retrofit 动态修改BaseUrl 操作

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

操作如下:
  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的操作就结束了

转载于:https://juejin.im/post/5c9dd8cbf265da30bf15c105

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值