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

      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 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);
        }
    }



你可能感兴趣的:(#,Android,框架,第三方库)