Retrofit 动态修改BaseUrl 操作

简介: Retrofit 动态修改BaseUrl 操作

开发中会遇到URL需要动态切换,若你还是通过gradle打包切换是否不太灵活,下面将介绍一下retrofit基于OKhttp中动态修改URL;

原理添加拦截器,在retrofit中的现实更加灵活了如下代码:

    private RetrofitUrlManager() {
            if (!DEPENDENCY_OKHTTP) { //使用本框架必须依赖 Okhttp
                throw new IllegalStateException("Must be dependency Okhttp");
            }
            UrlParser urlParser = new DefaultUrlParser();
            urlParser.init(this);
            setUrlParser(urlParser);
            this.mInterceptor = new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    if (!isRun()) // 可以在 App 运行时, 随时通过 setRun(false) 来结束本框架的运行
                        return chain.proceed(chain.request());
                    return chain.proceed(processRequest(chain.request()));
                }
            };
        }

    下面是对retrofit设置的URL解析及添加到拦截器中

      /**
           * 对 {@link Request} 进行一些必要的加工, 执行切换 BaseUrl 的相关逻辑
           *
           * @param request {@link Request}
           * @return {@link Request}
           */
          public Request processRequest(Request request) {
              if (request == null) return request;
              Request.Builder newBuilder = request.newBuilder();
              String url = request.url().toString();
              //如果 Url 地址中包含 IDENTIFICATION_IGNORE 标识符, 框架将不会对此 Url 进行任何切换 BaseUrl 的操作
              if (url.contains(IDENTIFICATION_IGNORE)) {
                  return pruneIdentification(newBuilder, url);
              }
              String domainName = obtainDomainNameFromHeaders(request);
              HttpUrl httpUrl;
              Object[] listeners = listenersToArray();
              // 如果有 header,获取 header 中 domainName 所映射的 url,若没有,则检查全局的 BaseUrl,未找到则为null
              if (!TextUtils.isEmpty(domainName)) {
                  notifyListener(request, domainName, listeners);
                  httpUrl = fetchDomain(domainName);
                  newBuilder.removeHeader(DOMAIN_NAME);
              } else {
                  notifyListener(request, GLOBAL_DOMAIN_NAME, listeners);
                  httpUrl = getGlobalDomain();
              }
              if (null != httpUrl) {
                  HttpUrl newUrl = mUrlParser.parseUrl(httpUrl, request.url());
                  if (debug)
                      Log.d(RetrofitUrlManager.TAG, "The new url is { " + newUrl.toString() + " }, old url is { " + request.url().toString() + " }");
                  if (listeners != null) {
                      for (int i = 0; i < listeners.length; i++) {
                          ((onUrlChangeListener) listeners[i]).onUrlChanged(newUrl, request.url()); // 通知监听器此 Url 的 BaseUrl 已被切换
                      }
                  }
                  return newBuilder
                          .url(newUrl)
                          .build();
              }
              return newBuilder.build();
          }

      具体的使用,在retrofitAPI接口中添加@Headers({"Domain-Name: CONTROL"}) Domain-Name是key,CONTROL 设置的URL对应的key名称

        /**
         * -----------------------
         * @author: qiuxianfu
         * @date: 2021/1/27
         * -----------------------
         */
        public interface PerformanceApi {
            @Headers({"Domain-Name: CONTROL"})
            @POST("xxx/xxx/getSiteAreaPlanning")
            Observable<PerformancesResponse> getDataList(@Query("userCode") String userCode);
            @Headers({"Domain-Name: CONTROL"})
            @POST("xxx/xxx/addDutyRoster")
            Observable<AddDutyTosterResponse> addDutyRoster(@Body AddDutyRosterRequest rosterRequest);
        }

        这里就是动态设置了,CONTROL这个和@Headers({"Domain-Name: CONTROL"}) 保持一致


        RetrofitUrlManager.getInstance().putDomain("CONTROL", InfieldAppUtils.getServerControlHttp()); }

        地址:https://github.com/qxf323/RetrofitUrlManager

        相关文章
        |
        缓存 Java 开发工具
        Flutter— 第一次运行Flutter工程时的Bug总结
        Flutter— 第一次运行Flutter工程时的Bug总结
         Flutter— 第一次运行Flutter工程时的Bug总结
        |
        Android开发
        【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )(一)
        【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )(一)
        1320 0
        |
        10月前
        |
        数据采集
        美团外卖商家数据采集软件,提取电话号手机号评分地址,销量评价内容【autojs版】
        这是一款基于AutoJS开发的美团外卖商家数据采集工具,可自动抓取商家名称、电话、评分、地址、月销量及评价内容等信息。支持多页滚动加载与详细数据采集
        |
        API 开发工具 Android开发
        【01】完整开发即构美颜sdk的uni官方uts插件—让所有开发者可以直接使用即构美颜sdk的能力-优雅草卓伊凡
        【01】完整开发即构美颜sdk的uni官方uts插件—让所有开发者可以直接使用即构美颜sdk的能力-优雅草卓伊凡
        643 23
        【01】完整开发即构美颜sdk的uni官方uts插件—让所有开发者可以直接使用即构美颜sdk的能力-优雅草卓伊凡
        |
        API Android开发 容器
        33. 【Android教程】悬浮窗:PopupWindow
        33. 【Android教程】悬浮窗:PopupWindow
        2430 2
        |
        Android开发
        Android经典实战之Textview文字设置不同颜色、下划线、加粗、超链接等效果
        本文介绍了 `SpannableString` 在 Android 开发中的强大功能,包括如何在单个字符串中应用多种样式,如颜色、字体大小、风格等,并提供了详细代码示例,展示如何设置文本颜色、添加点击事件等,助你实现丰富文本效果。
        1268 4
        |
        Android开发
        android Jetpack Navigation组件——堆栈操作和动画效果
        android Jetpack Navigation组件——堆栈操作和动画效果
        1072 0
        android Jetpack Navigation组件——堆栈操作和动画效果
        |
        人工智能 Java
        通过okhttp调用SSE流式接口,并将消息返回给客户端
        通过okhttp调用SSE流式接口,并将消息返回给客户端
        |
        缓存 API Android开发
        Retrofit运行时动态改变BaseUrl解决方案
        Retrofit运行时动态改变BaseUrl解决方案
        1614 0
        |
        开发工具 iOS开发
        阿里云本机一键登录集成
        阿里云本机一键登录集成
        648 0