本文主要是介绍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 {@Overridepublic Response intercept(Chain chain) throws IOException {//获取requestRequest request = chain.request();//从request中获取原有的HttpUrl实例oldHttpUrlHttpUrl oldHttpUrl = request.url();List<String> headerValues = request.headers("domain");//获取request的创建者builderRequest.Builder builder = request.newBuilder();//从request中获取headers,通过给定的键url_name//如果有这个header,先将配置的header删除,因此header仅用作app和okhttp之间使用builder.removeHeader("domain");//匹配获得新的BaseUrlint 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
点击链接加入群【Android学习群】
这篇关于Retrofit-OkHttp 动态切换服务器地址的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!