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

        相关文章
        |
        JavaScript 开发工具 Windows
        扩展的方法:es6 安装模块builder
        扩展的方法:es6 安装模块builder
        42 0
        |
        Java 测试技术 API
        Java RESTful中的PATCH请求:局部更新与资源修改
        在RESTful架构中,PATCH请求是一种用于局部更新已有资源的操作。PATCH请求允许客户端将部分数据发送到服务器,以便对资源进行局部修改,而不必替换整个资源。本文将引导您深入了解Java中使用PATCH请求构建RESTful API,探讨其特点、实现方式、用例以及在实际应用中的优势。
        |
        2月前
        |
        JSON 前端开发 中间件
        React读取properties配置文件转化为json对象并使用在url地址中
        本文介绍了如何在React项目中读取properties配置文件,将其内容转化为JSON对象,并在请求URL地址时使用这些配置。文章详细说明了异步读取文件、处理字符串转换为JSON对象的过程,并提供了一个封装函数,用于在发起请求前动态生成配置化的URL地址。
        79 1
        |
        4月前
        |
        JSON JavaScript 前端开发
        若依修改,若依如何发送get和post请求,发送数据请求的写法,若依请求的API在src的api文件下,建立请求的第一步,在API中新建一个文件,第二步新建JavaScript文件
        若依修改,若依如何发送get和post请求,发送数据请求的写法,若依请求的API在src的api文件下,建立请求的第一步,在API中新建一个文件,第二步新建JavaScript文件
        |
        4月前
        |
        JavaScript API
        前后端数据交互.js文件的axios的写法,想要往后端发送数据,页面注入API,await的意思是同步等待服务器数据,并返回,axios注入在其他页面,其他页面调用的时候,同步作用
        前后端数据交互.js文件的axios的写法,想要往后端发送数据,页面注入API,await的意思是同步等待服务器数据,并返回,axios注入在其他页面,其他页面调用的时候,同步作用
        |
        6月前
        |
        JavaScript 前端开发 API
        在vue中如何获取项目src外层的config目录以及api接口proxy的target代理地址
        在vue中如何获取项目src外层的config目录以及api接口proxy的target代理地址
        83 0
        |
        设计模式 Java API
        使用Spring框架创建一个RESTful API,实现学生信息的管理,包括资源的创建、读取、更新和删除。
        在当今的Web应用程序开发中,RESTful API(Representational State Transferful Application Programming Interface)变得越来越重要。Spring框架提供了强大的工具和功能,以便轻松创建、读取、更新和删除(CRUD)资源。在这篇文章中,我们将深入探讨如何使用Spring框架创建一个RESTful API,并通过一个完整的示例演示。
        343 0
        |
        Java 测试技术 API
        Java RESTful中的PUT请求:资源的更新与完整替换
        在RESTful架构中,PUT请求是一种用于更新或完整替换资源的重要操作。PUT请求允许客户端发送数据到服务器,以更新已有资源的状态,或者用新数据完全替换旧资源。本文将引导您深入了解Java中使用PUT请求构建RESTful API,探讨其特点、实现方式、用例以及在实际应用中的优势。
        |
        缓存 API Android开发
        Retrofit运行时动态改变BaseUrl解决方案
        Retrofit运行时动态改变BaseUrl解决方案
        1066 0
        |
        JavaScript 前端开发
        Yii2中的资源管理的sourcePath/basePath/baseUrl分别是指的什么
        Yii2中的资源管理的sourcePath/basePath/baseUrl分别是指的什么
        196 0
        Yii2中的资源管理的sourcePath/basePath/baseUrl分别是指的什么