Android 通过okhttp3的拦截器来设置BaseUrl

最近有这样一个需求:服务器地址可能会变但是每个服务器的方法是必然相同的,也就是说api的BaseUrl是变化的。

我是用的是okhttp3+retrfoit2,用注解的方式设置单个请求的链接等信息,所以我最先想到的是在拦截器里面设置api里面的BaseUrl。

先上代码


/**
 * 将BaseUrl设置成自己想要的样子
 */
public class UrlInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Request.Builder requestBuilder = request.newBuilder();
        Headers headers = request.headers();
        String headerValue = headers.get(ApiService.baseUrlType);
        if (!TextUtils.isEmpty(headerValue)) {
            HttpUrl oldUrl = request.url();
            if (headerValue.equals(ApiService.GAN)) {
                HttpUrl baseUrl = HttpUrl.parse(Base.getGirlBaseUrl());
                baseUrl = createRequest(oldUrl, baseUrl);
                requestBuilder.url(baseUrl);
            }
        }
        return chain.proceed(requestBuilder.build());
    }

    private HttpUrl createRequest(HttpUrl oldUrl, HttpUrl baseUrl) {
        HttpUrl newHttpUrl = oldUrl.newBuilder()
                .scheme(baseUrl.scheme())//http协议如:http或者https
                .host(baseUrl.host())//主机地址
                .port(baseUrl.port())//端口
                .build();
        return newHttpUrl;
    }

}
以上就是一个拦截器的代码,这里说下重点。
HttpUrl 这个类里面存放的就是链接这些信息,我们也可以通过它来设置baseUrl。
headerValue其实是个header,通过这个指定的header来判断应该使用的BaseUrl
request.newBuilder() 这里的newBuilder()并不是单纯地创建一个空的Builder,点进去看源码我们可以发现newBuilder()得到的是一个赋过值的Builder对象,里面的参数就是你传递过来的参数。
HttpUrl.parse可以将你传递过来的链接解析成一个HttpUrl对象。
return chain.proceed(requestBuilder.build()); 将Builder对象build后再返回就达到了设置BaseUrl的效果。

拦截器的类写好了 ,有人可能不会使用,这个类针对的是okhttp3,与Retrofit可以说是毫无关系。

   _builder = new OkHttpClient.Builder()
                .connectTimeout(TIME_OUT, TimeUnit.SECONDS)
                .writeTimeout(TIME_OUT, TimeUnit.SECONDS)
                .readTimeout(TIME_OUT, TimeUnit.SECONDS)
                //这里就是使用方法
                .addInterceptor(new UrlInterceptor())
                .retryOnConnectionFailure(true);//请求失败重新请求

另外我依然觉得这种方法不够骚,希望路过的大佬们能指点下小弟。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值