最近有这样一个需求:服务器地址可能会变但是每个服务器的方法是必然相同的,也就是说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);//请求失败重新请求
另外我依然觉得这种方法不够骚,希望路过的大佬们能指点下小弟。