关于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
    评论
在使用 Retrofit 进行网络请求时,可能会遇到超时的情况。这时可以通过以下几种方式来解决: 1. 修改超时时间: 在 Retrofit 的创建过程中,可以通过 `okhttp` 的 `newBuilder()` 方法来设置超时时间。例如: ```java OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build(); ``` 2. 使用拦截器: 可以使用 `okhttp` 的拦截器来处理超时情况。例如,下面的代码使用了 `RetryInterceptor` 来进行请求重试: ```java public class RetryInterceptor implements Interceptor { private int maxRetry; private int retryNum = 0; public RetryInterceptor(int maxRetry) { this.maxRetry = maxRetry; } @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Response response = chain.proceed(request); while (!response.isSuccessful() && retryNum < maxRetry) { retryNum++; response = chain.proceed(request); } return response; } } ``` 然后在创建 `OkHttpClient` 时添加该拦截器: ```java OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .addInterceptor(new RetryInterceptor(3)) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build(); ``` 这样,在请求失败时会进行重试,最多重试 `maxRetry` 次。 3. 使用 RxJava 的超时操作符: 如果你使用了 RxJava 来处理 Retrofit 的请求,可以使用 RxJava 的 `timeout()` 操作符来设置超时时间。例如: ```java apiService.getData() .timeout(10, TimeUnit.SECONDS) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<Data>() { @Override public void onSubscribe(Disposable d) {} @Override public void onNext(Data data) {} @Override public void onError(Throwable e) {} @Override public void onComplete() {} }); ``` 这样,在请求超过 `10` 秒钟时,会触发 `onError()` 方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值