Retrofit-OkHttp 动态切换服务器地址
Posted u013164293
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Retrofit-OkHttp 动态切换服务器地址相关的知识,希望对你有一定的参考价值。
需求:
一个app可能需要根据地区、用户等,动态设置不同的服务器地址,而okhttp为单例模式,不支持动态切换
方案:
利用okhttp的拦截器功能,实现该需求
1、利用headers参数,设置fixed标记的为地址固定不变接口,其他为动态切换(逻辑判断根据需求自己定义)
@Headers({"domain:fixed"})//设置fixed为固定不变地址
@GET("xx/xx/apiMethod")
Observable<Result> apiMethod(@QueryMap Map<String, String> params);
2、编写动态切换地址的拦截器
public class BaseUrlInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
//获取request
Request request = chain.request();
//从request中获取原有的HttpUrl实例oldHttpUrl
HttpUrl oldHttpUrl = request.url();
List<String> headerValues = request.headers("domain");
//获取request的创建者builder
Request.Builder builder = request.newBuilder();
//从request中获取headers,通过给定的键url_name
//如果有这个header,先将配置的header删除,因此header仅用作app和okhttp之间使用
builder.removeHeader("domain");
//匹配获得新的BaseUrl
int domainType = 0;// 0:动态 1:固定
for (int i = 0; i < headerValues.size(); i++) {
if (headerValues.get(i).equals("fixed")) {
domainType = 1;
}
}
//根据业务逻辑,动态获取的服务器地址
String baseUrl = SharedPreferencesUtil.getString(MyApplication.getInstance(), "", "baseUrl", "");
if (!TextUtils.isEmpty(baseUrl) && domainType == 0) {
HttpUrl newBaseUrl = null;
newBaseUrl = HttpUrl.parse(baseUrl);
//重建新的HttpUrl,修改需要修改的url部分
HttpUrl newFullUrl = oldHttpUrl
.newBuilder()
.scheme(newBaseUrl.scheme())
.host(newBaseUrl.host())//更换主机名
.port(newBaseUrl.port())//更换端口
.build();
//重建这个request,通过builder.url(newFullUrl).build();
// 然后返回一个response至此结束修改
return chain.proceed(builder.url(newFullUrl).build());
}
return chain.proceed(chain.request());
}
}
3、okhttp配置拦截器
okBuilder = new OkHttpClient.Builder();
...
okBuilder.addInterceptor(new BaseUrlInterceptor());//配置动态切换拦截器
...
client = okBuilder.build();
retrofit = new Retrofit.Builder()
.baseUrl(HOST)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
如果您有其他需要,或者相关内容有什么不完善的地方,请留言给我!!
您也可以加入下方qq群,共同学习进步,感谢参与!!
android学习交流群:523487222
以上是关于Retrofit-OkHttp 动态切换服务器地址的主要内容,如果未能解决你的问题,请参考以下文章