Retrofit动态修改BaseUrl

1.给Retrofit添加BaseUrlManagerInterceptor拦截器。

private static final String          TAG = "RetrofitManager";
private static       RetrofitManager manager;
private              Retrofit        retrofit;

/**
 * 私有构造器 无法外部创建
 * 初始化必要对象和参数
 */
private RetrofitManager() {
   // 初始化okhttp
   OkHttpClient client = new OkHttpClient.Builder()
                       .connectTimeout(5 * 1000, TimeUnit.MILLISECONDS)
                       .readTimeout(5 * 1000, TimeUnit.MILLISECONDS)
                       .writeTimeout(5 * 1000, TimeUnit.MILLISECONDS)
                       .addInterceptor(new BaseUrlManagerInterceptor(BaseApplication.getInstance()))
                       .proxy(Proxy.NO_PROXY)
                       .build();
   
   // 初始化Retrofit
   retrofit = new Retrofit.Builder()
               .client(client)
               .baseUrl(ConstantUrl.BASE_URL)
               .addConverterFactory(GsonConverterFactory.create())
               .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
               .build();
}

public static RetrofitManager getInstance() {
   if (manager == null) {
      synchronized (RetrofitManager.class) {
         if (manager == null) {
            manager = new RetrofitManager();
         }
      }
   }
   return manager;
}

public Retrofit getRetrofit() {
   return retrofit;
}

//创建一个拦截器

public class BaseUrlManagerInterceptor implements Interceptor {
   
   private static final String          TAG = "BaseUrlManagerInterceptor";
   private              BaseApplication baseApplication;
   
   public BaseUrlManagerInterceptor(BaseApplication baseApplication) {
      super();
      this.baseApplication = baseApplication;
   }
   
   @Override
   public Response intercept(Chain chain) throws IOException {
      //获取原始的originalRequest
      Request originalRequest = chain.request();
      //获取originalRequest的创建者builder
      Request.Builder builder = originalRequest.newBuilder();
      //获取当前的url
      HttpUrl oldUrl = originalRequest.url();
      LogManager.i(TAG, "intercept:------------oldUrl---------->" + oldUrl);
      
      //获取头信息的集合如:jeapp ,njeapp ,mall
      List<String> urlnameList = originalRequest.headers("urlname");
      if (urlnameList != null && urlnameList.size() > 0) {
         //删除原有配置中的值,就是namesAndValues集合里的值
         builder.removeHeader("urlname");
         //获取头信息中配置的value,如:manage或者mdffx
         String urlname = urlnameList.get(0);
         LogManager.i(TAG, "intercept:-------urlname------" + urlname);
         HttpUrl baseURL = null;
         //根据头信息中配置的value,来匹配新的base_url地址
         if (!TextUtils.isEmpty(urlname)) {
            switch (urlname) {
               case ConstantData.TO_FIRST_PAGR_FLAG:
                  baseURL = HttpUrl.parse(ConstantData.TO_FIRST_PAGR_URL);
                  break;
               case ConstantData.TO_PROJECT_FLAG:
                  baseURL = HttpUrl.parse(ConstantData.TO_PROJECT_URL);
                  break;
               //                    case ConstantData.TO_PROJECT_FLAG:
               //                        baseURL = HttpUrl.parse(ConstantData.TO_PROJECT_URL);
               //                        break;
               case ConstantData.TO_RESOURCE_FLAG:
                  baseURL = HttpUrl.parse(ConstantData.TO_RESOURCE_URL);
                  break;
               case ConstantData.TO_MINE_FLAG:
                  baseURL = HttpUrl.parse(ConstantData.TO_MINE_URL);
                  break;
               case ConstantData.TO_USER_DATA_FLAG:
                  baseURL = HttpUrl.parse(ConstantData.TO_USER_DATA_URL);
                  break;
               default:
                  break;
            }
            //          if ("jeapp".equals(urlname)) {
            //             baseURL = HttpUrl.parse(ConstantData.PRE_URL);
            //          } else if ("njeapp".equals(urlname)) {
            //             baseURL = HttpUrl.parse(ConstantData.PRE_NEW_URL);
            //          } else if ("mall".equals(urlname)) {
            //             baseURL = HttpUrl.parse(ConstantData.MALL_URL);
            //          }
            
            LogManager.i(TAG, "intercept:-----oldUrl-----" + oldUrl.toString());
            //重建新的HttpUrl,需要重新设置的url部分
            HttpUrl newHttpUrl = oldUrl.newBuilder()
                               .scheme(baseURL.scheme())//http协议如:http或者https
                               .host(baseURL.host())//主机地址
                               .port(baseURL.port())//端口
                               .build();
            LogManager.i(TAG, "intercept:------scheme----" + baseURL.scheme());
            LogManager.i(TAG, "intercept:-----host-----" + baseURL.host());
            LogManager.i(TAG, "intercept:-----port-----" + baseURL.port());
            LogManager.i(TAG, "intercept:-----newHttpUrl-----" + newHttpUrl.toString());
            
            //获取处理后的新newRequest
            Request.Builder newBuilder = builder.url(newHttpUrl);
            
            Request newRequest = newBuilder.build();
            return chain.proceed(newRequest);
         }
         originalRequest = builder.build();
         return chain.proceed(originalRequest);
      } else {
         originalRequest = builder.build();
         return chain.proceed(originalRequest);
      }
      
   }
}

 

2.添加请求的头部信息

@Headers("urlname:" + ConstantData.TO_FIRST_PAGR_FLAG)
@GET(ConstantUrl.FIRST_PAGE_DETAILS_URL)
Observable<ResponseBody> getFirstPageDetails(@QueryMap Map<String, String> bodyParams);

//常量类

public class ConstantData {
   
   public static final String TO_FIRST_PAGR_FLAG = "FIRST_PAGR_FLAG";
   public static final String TO_PROJECT_FLAG    = "PROJECT_FLAG";
   public static final String TO_RESOURCE_FLAG   = "RESOURCE_FLAG";
   public static final String TO_MINE_FLAG       = "MINE_FLAG";
   public static final String TO_USER_DATA_FLAG  = "USER_DATA_FLAG";
   
   public static final String TO_FIRST_PAGR_URL = ConstantUrl.BASE_URL;
   public static final String TO_PROJECT_URL    = ConstantUrl.BASE_URL3;
   public static final String TO_RESOURCE_URL   = ConstantUrl.BASE_URL2;
   public static final String TO_MINE_URL       = ConstantUrl.BASE_URL;
   public static final String TO_USER_DATA_URL  = ConstantUrl.BASE_URL0;
   
}

 

public class ConstantUrl {
   
   //正式地址(此地址无效,请替换)
   public static final String BASE_URL0 = "https://is.snssdk.net/";
   
   public static final String BASE_URL  = "http://is.snssdk.com/";
   public static final String BASE_URL2 = "http://gank.io/";
   public static final String BASE_URL3 = "https://wanandroid.com/";
}

 

添加此拦截器就可以在app在调用不同模块时,发起不同url的请求。如需要完整项目,请联系qq1164688204。

项目功能介绍:RxJava2和Retrofit2项目,添加自动管理token功能,添加RxJava2生命周期管理,使用App架构设计是MVP模式和MVVM模式,同时使用组件化,部分代码使用Kotlin,此项目持续维护中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值