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

相关文章

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

Windows Server 2025 搭建NPS-Radius服务器的步骤

《WindowsServer2025搭建NPS-Radius服务器的步骤》本文主要介绍了通过微软的NPS角色实现一个Radius服务器,身份验证和证书使用微软ADCS、ADDS,具有一定的参考价... 目录简介示意图什么是 802.1X?核心作用802.1X的组成角色工作流程简述802.1X常见应用802.

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

SpringBoot实现多环境配置文件切换

《SpringBoot实现多环境配置文件切换》这篇文章主要为大家详细介绍了如何使用SpringBoot实现多环境配置文件切换功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 示例代码结构2. pom文件3. application文件4. application-dev文

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Java根据IP地址实现归属地获取

《Java根据IP地址实现归属地获取》Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣... 目录一、使用Ip2region离线获取1、Ip2region简介2、导包3、下编程载xdb文件4、J

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配