Retrofit-OkHttp 动态切换服务器地址

2024-08-30 15:32

本文主要是介绍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 动态切换服务器地址的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121221

相关文章

Apache Tomcat服务器版本号隐藏的几种方法

《ApacheTomcat服务器版本号隐藏的几种方法》本文主要介绍了ApacheTomcat服务器版本号隐藏的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1. 隐藏HTTP响应头中的Server信息编辑 server.XML 文件2. 修China编程改错误

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

如何在一台服务器上使用docker运行kafka集群

《如何在一台服务器上使用docker运行kafka集群》文章详细介绍了如何在一台服务器上使用Docker运行Kafka集群,包括拉取镜像、创建网络、启动Kafka容器、检查运行状态、编写启动和关闭脚本... 目录1.拉取镜像2.创建集群之间通信的网络3.将zookeeper加入到网络中4.启动kafka集群

Python如何实现 HTTP echo 服务器

《Python如何实现HTTPecho服务器》本文介绍了如何使用Python实现一个简单的HTTPecho服务器,该服务器支持GET和POST请求,并返回JSON格式的响应,GET请求返回请求路... 一个用来做测试的简单的 HTTP echo 服务器。from http.server import HT

如何安装 Ubuntu 24.04 LTS 桌面版或服务器? Ubuntu安装指南

《如何安装Ubuntu24.04LTS桌面版或服务器?Ubuntu安装指南》对于我们程序员来说,有一个好用的操作系统、好的编程环境也是很重要,如何安装Ubuntu24.04LTS桌面... Ubuntu 24.04 LTS,代号 Noble NumBAT,于 2024 年 4 月 25 日正式发布,引入了众

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Spring Boot实现多数据源连接和切换的解决方案

《SpringBoot实现多数据源连接和切换的解决方案》文章介绍了在SpringBoot中实现多数据源连接和切换的几种方案,并详细描述了一个使用AbstractRoutingDataSource的实... 目录前言一、多数据源配置与切换方案二、实现步骤总结前言在 Spring Boot 中实现多数据源连接

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节