使用 Retrofit + okHttp 网络请求中,动态切换测试服和正式服(BaseUrl)

转载请注明出处:https://blog.csdn.net/DemoKui/article/details/83115501

项目需求

相信在项目开发中,一般公司都会有自己的开发测试服和生产环境正式服,例如:

  • http://damon.com // 正式服
  • http://test.com // 测试服

而一般情况下正式服和测试服只是前缀不同,后面的接口路径不变,就好比只是 damon 和 test 的差异而已,平时打包时手动注释掉一个就好了,但是经常改完 bug 或者开发完一个功能,我们迫不及待的赶紧打个包去 leader 那儿展示自己的成果,但是,领导不一会儿就说,“这是测试服的,打个正式服的出来”、“这是正式服的,打个测试服的出来”,还有测试妹子也是一样,也会经常提这些没技术含量而又不得不做的操作,那么我是否可以在 debug 版本时留一个只有我们内部人员知道的切换入口,随时随地的切换正式服和测试服呢?

这样一来,我们就不用这么麻烦的不停的打包,好了,需求明确了,就是在 debug 版本中随时切换主域名。

实现思路

据说这个更改 BaseUrl 操作 Api 之前 Retrofit 是存在的,后来删除了,不知道为什么?不管了,自己搞定吧。

在 OKHttp3 中有拦截器 Interceptor,这个拦截器中有一个 Request 类,在这个类中有一个成员变量 HttpUrl,而这个 HttpUrl 就是我们每次请求服务器的地址,那么既然能拿到这个地址,问题就好办了,拿到它之后根据开关切换状态更改这个 HttpUrl ,更改完了之后再把新的地址设置回去,问题就完美解决了。

好了,接下来开始实现吧。

代码实现

我们先定义一个开关


  public static Boolean isTest = true;     // 是否是测试服  默认是测试服

然后自定义拦截器 Interceptor

public class TestInterceptor implements Interceptor {

    public TestInterceptor() {
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Request.Builder requestBuilder = request.newBuilder();
        // 这里是拦截下来的 url ,注意:这个 url 是全量url,也就是完整的url,并不是单纯的主域名地址。
        String url = request.url().toString();
        if(App.isTest ) {
            // 如果是测试服并且拦截下来的url中还包含正式服,将url前缀替换成测试服的url前缀
            if (url.contains("demon")) {
                url = url.replace("demon", "test");
            }
        }
        // 将新的 url 再设置回去
        request = requestBuilder.url(url).build();
        return chain.proceed(request);
    }
}

然后在 UI 入口处控制这个开关 isTest 的状态值就好了。

感谢:
参考文献:https://blog.csdn.net/qq_20230661/article/details/69548083

PS: 这种算是很简单的动态配置 BaseUrl 了,其实项目中海油很多这样的需求,只是主域名不仅仅是两个这么简单,比如一个大项目中用户可能是一个单独的主机,购物车又是另一个主机,支付又是另一个主机,等等等等这样的多主机需求,不过还是在拦截器中动心思,以及接口上 @Headers 注解的使用,还没搞懂待研究,有经验的朋友希望多多分享。

=============================================================

2019-12-26 更新

之前写的那个虽说可以解决测试服和正式服的需要,但是满足不了所有场景,最近在迁移公司的 eclipse 项目转 Studio(鬼知道现在才迁移,特么还是我自愿的,公司压一直不愿意重构,老掉牙的项目),在迁移过程中需要更换网络框架,就出现了多台服务的情况,发现之前写的动态切换 BaseUrl 的方法满足不了项目中的需求,于是又开始面向百度编程,发现了一个好文章。

传送门:Retrofit 动态修改BaseUrl

这篇文章写得清晰明了易懂,收藏了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值