使用retrofit做为网络请求时,解决多个BaseURL切换的问题

本文介绍了一种在使用Retrofit框架时,针对不同第三方SDK的BaseUrl动态切换的方法。通过利用OkHttp拦截器,能够在不破坏原有代码结构的前提下,灵活地变更BaseUrl。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      Retrofit作为最火的网络请求框架,基本上都在使用。我们引入到项目中,并对其进行封装,同时指定了一个基本保持不变的baseUrl,但是,如果我们接入了第三方的sdk,需要请求第三方的url来获取相关数据的时候,就存在了一个问题相当严重的问题,第三方的baseUrl 并不是我们项目中所使用的,那该怎么办呢?

     1.首先,我们不可能只改变一个baseUrl的值,把封装的代码在复制一遍,这样虽然能实现,但是有没有考虑过如果要接多个第三方的呢?(作为一个高大上,有洁癖的码农,有没有觉得这样很low)

     2.我们可以使用强大的okhttp的拦截器进行拦截


 private static class BaseUrlInterceptor implements Interceptor {

        @Override
        public Response intercept(Chain chain) throws IOException {

            //获取request
            Request request = chain.request();
            //从request中获取原有的HttpUrl实例oldHttpUrl
            HttpUrl oldHttpUrl = request.url();
            //获取request的创建者builder
            Request.Builder builder = request.newBuilder();
            //从request中获取headers,通过给定的键url_name
            List<String> headerValues = request.headers("bqs_auth");
            if (headerValues != null && headerValues.size() > 0) {
               //如果有这个header,先将配置的header删除,因此header仅用作app和okhttp之间使用
                builder.removeHeader("bqs_auth");
                //匹配获得新的BaseUrl
                String headerValue = headerValues.get(0);
                HttpUrl newBaseUrl = null;
                if ("taobao".equals(headerValue)) {
                    newBaseUrl = HttpUrl.parse(Base_URL_BQS);
                }else if ("other".equals(headerValue)) {
                    newBaseUrl = HttpUrl.parse(Base_OTHER_UR);
                }else{

                    newBaseUrl = oldHttpUrl;
                }
                //重建新的HttpUrl,修改需要修改的url部分
                 HttpUrl newFullUrl = oldHttpUrl
                         .newBuilder()
                         .scheme("https")//更换网络协议
                         .host(newBaseUrl.host())//更换主机名
                         .port(newBaseUrl.port())//更换端口
                         .removePathSegment(0)//移除第一个参数
                         .build();
                //重建这个request,通过builder.url(newFullUrl).build();
                // 然后返回一个response至此结束修改
                Log.e("Url", "intercept: "+newFullUrl.toString());
                return chain.proceed(builder.url(newFullUrl).build());
            }
            return chain.proceed(request);
        }
    }



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值