解决Retrofit多BaseUrl及运行时动态改变BaseUrl(二)

Android-以最简洁的Api让Retrofit同时支持多个BaseUrl以及动态改变BaseUrl 以最简洁的 Api 让 Retrofit 同时支持多个 BaseUrl 以及动态改变 BaseUrl 立即下载

原文地址: https://www.jianshu.com/p/35a8959c2f86

前言

我在之前的文章 《解决Retrofit多BaseUrl及运行时动态改变BaseUrl》 中,介绍了市面上能够解决此类问题的 4 个常见的解决方案,并开源了自己经过优化后的解决方案 RetrofitUrlManager,现在再为大家带来此系列的第二篇文章,这篇文章主要介绍 RetrofitUrlManager 针对 BaseUrl 替换逻辑的重大升级,因为这个升级对于 RetrofitUrlManager 足够重要,将使 RetrofitUrlManager 能够从容应对更多复杂的需求,所以单独写一篇文章让更多的人能够知道

Github : 您的 Star 是我坚持的动力 ✊

为什么不使用多 Retrofit 实例的方案?

在上篇文章 《解决Retrofit多BaseUrl及运行时动态改变BaseUrl》 中,4 种方案的特点和不足我都描述的很清楚,建议没看过这篇文章的可以去看看这篇文章,扩宽知识面,在后面的时间里经常有人问我为什么不使用多 Retrofit 实例的方案,多个 Retrofit 实例看起来并不会占用多少资源啊?

在回答之前为了让看这篇文章的人能了解我在说什么,所以我再粘贴下 上篇文章 中关于这个方案的部分描述

民间常用解决方案:
之前也看过很多开源的聚合类 App 源码, 像一些整合 知乎、 豆瓣、 Gank 等多个平台数据的 App, 因为各自平台的域名不同, 所以大多数这类 App 会给每个平台都各自创建一个 Retrofit 对象, 即不同的 BaseUrl 使用不同的 Retrofit 对象来创建 ApiService 进行请求, 这样只要新增一个不同的 BaseUrl, 那就需要重新创建一个新的 Retrofit 对象

我在这篇文章中重新回答下这个问题,为每个不同的 BaseUrl 都创建一个其他配置属性都一模一样的 Retrofit 实例不止会造成资源的浪费,还会造成接口管理成本的增加,这个才是最重要的一点, 举个例

我们平时项目中所有的 ApiService 都是使用同一个 Retrofit 实例的 Retrofit#create(ApiService) 方法进行实例化后开始接口的请求

但是当项目中出现多个 Retrofit 实例后,我们在开发中不光要区分哪些接口使用哪个 ApiService,还要区分哪些 ApiService 需要使用哪个 Retrofit 实例进行实例化,如果 ApiService 使用错误的 Retrofit 实例进行实例化,那这个 ApiService 的所有接口请求都注定完全失败

越复杂的项目,开发人数越多的项目,出错的风险就越大,并且扩展性也在大打折扣,后面一有变更将会十分痛苦,随着项目中接口的增加,以及 Retrofit 实例的增加 (BaseUrl 的增加),这个管理成本会成几何倍的增加

使用多 Retrofit 实例的方案前期投入成本过高,可能会影响之前项目管理接口的方式,某些封装过 Retrofit 的项目,也可能需要大改,对于老项目的接入不利,而使用 RetrofitUrlManager 不仅可以满足多 BaseUrl 及运行时动态改变 BaseUrl 的需求,还具有热插拔以及低侵入性的特点,在使用过程中将不会影响到之前的接口管理方式和使用方式,还具有极强的扩展性,可应对后面陆续增加的极其复杂的 BaseUrl 替换需求

升级之前的 RetrofitUrlManager 的问题

此次升级之前的 RetrofitUrlManager 版本,只是将 上篇文章 的思想完全实现,有了整个框架的基础,但是在动态替换 BaseUrl 方面还不够强大,最被大家吐槽的就是只能替换 BaseUrl 的域名

比如一个需要替换 BaseUrl 的 Url 地址为 "https:www.google.com/api/v2",其中 "https:www.google.com/api" 是我们传给 Retrofit 的 BaseUrl,这时我们使用 RetrofitUrlManager 框架,想把 BaseUrl 替换成 "https:www.github.com",我们期望的替换后的 URL 地址是 "https:www.github.com/v2",但使用框架替换后的实际 URL 地址是 "https:www.github.com/api/v2", "/api" 作为 BaseUrl 的一部分并没有被新的 BaseUrl 替换掉,只是替换了 BaseUrl 中的域名

RetrofitUrlManager 是如何改善的

改善之前先要先分析为什么会这样?因为 RetrofitUrlManager 框架在拦截器中拦截到的 URL 地址是 Retrofit 已经把 BaseUrl 和接口注解中的相对路径合并后得到的最终路径地址,所以框架并不知道您传给 Retrofit 的 BaseUrl 除了域名外还包含后面的 "/api",框架不知道 BaseUrl 的具体值,所以框架只会默认所有的 BaseUrl 都只含有域名,所以也就只能替换域名

高级模式

想要解决此类问题也很简单,告诉 RetrofitUrlManager 框架您传给 Retrofit 的 BaseUrl 具体值即可,所以框架升级后增加了 RetrofitUrlManager#startAdvancedModel(String) 方法,在 App 初始化时将您传给 Retrofit 的 BaseUrl 同样传给此方法,即可开启高级模式,高级模式即可替换拥有多个 pathSegments 的 BaseUrl,不再局限于只能替换域名

什么是 pathSegment?

在 "https://www.github.com/wiki/part?name=jess" 中,其中的 "/wiki" 和 "/part" 就是 pathSegment, PathSize 就是 pathSegment 的个数

这个 URL 地址的 PathSize 就是 2, 第一个 pathSegment 是 "/wiki",第二个 pathSegment 是 "/part",可以粗略的理解为域名后面跟了几个 "/" PathSize 就是几

高级模式的替换规则

  1. 旧 URL 地址为 "https://www.github.com/wiki/part",您在 App 初始化时传入 RetrofitUrlManager#startAdvancedModel(String) 的 BaseUrl 为 "https://www.github.com/wiki",您想替换成的 BaseUrl 地址是 "https://www.google.com/api",经过框架替换后生成的最终 URL 地址为 "http://www.google.com/api/part"

  2. 旧 URL 地址为 "https://www.github.com/wiki/part",您在 App 初始化时传入 RetrofitUrlManager#startAdvancedModel(String) 的 BaseUrl 为 "https://www.github.com/wiki",您想替换成的 BaseUrl 地址是 "https://www.google.com",经过框架替换后生成的最终 URL 地址为 "http://www.google.com/part"

  3. 旧 URL 地址为 "https://www.github.com/wiki/part", 您在 App 初始化时传入 RetrofitUrlManager#startAdvancedModel(String) 的 BaseUrl 为 "https://www.github.com",您想替换成的 BaseUrl 地址是 "https://www.google.com/api",经过框架替换后生成的最终 URL 地址为 "http://www.google.com/api/wiki/part"

超级模式

超级模式是高级模式的加强版,优先级高于高级模式,按理说高级模式就能满足开发中的大部分需求,那什么又是超级模式呢?那就要先来说说高级模式了

高级模式的原理

在高级模式中您需要在 App 初始化时将您传给 Retrofit 的 BaseUrl 同样传给 RetrofitUrlManager#startAdvancedModel(String) 一份,用以开启高级模式,成功开启高级模式后,这个传给 RetrofitUrlManager#startAdvancedModel(String) 的 BaseUrl 就会作为框架替换 BaseUrl 的基准

什么叫作基准呢? 用此 BaseUrl 开启高级模式,并不意味着框架就只能替换 域名 为 "www.github.com" 前两个 pathSegments 为 "/wiki/part" 的 URL,只要拥有域名以及大于或等于两个 pathSegments 的 URL 都可以被框架替换,因此高级模式只会保存传入 RetrofitUrlManager#startAdvancedModel(String) 的 BaseUrl 的格式 (保存 pathSegments 的个数),并不是保存具体的值

高级模式的局限

如果传给 RetrofitUrlManager#startAdvancedModel(String) 的 BaseUrl 为 "https://www.github.com/wiki/part" (PathSize = 2),框架就会将项目中所有 URL 中的 域名 以及 域名 后面的前两个 pathSegments 作为可被替换的 BaseUrl 整体,意味着框架只会将 URL 中的 域名 以及前两个 pathSegments 剪切并替换为您期望的 BaseUrl

这时服务器突然作出调整,项目中的一部分 URL 只需要将 "https://www.github.com/wiki" (PathSize = 1) 替换掉, 第二个 pathSegment "/part" 不再作为 BaseUrl 的一部分,不能被替换掉,必须要保留下来

这时项目中就出现了多个需要被替换的 BaseUrl 格式 (PathSize 不同),有些 URL 只需要替换 域名 以及前两个 pathSegments,有些又只需要替换 域名 以及前一个 pathSegments,但是在开启高级模式时,只保存了一个 BaseUrl 的格式,这时使用高级模式实现此需求就比较棘手

这个需求是一个比较变态的需求,可能很多人遇不上,但是我想让您知道当您遇上了也不要怕,因为 RetrofitUrlManager 的超级模式已经帮您考虑周全

超级模式的用法

超级模式与高级模式不同的是,开启超级模式并不需要调用 API,只须要在需要开启超级模式的 Url 尾部加上 RetrofitUrlManager#IDENTIFICATION_PATH_SIZE (#baseurl_path_size=) + PathSize,这样就明确的告诉了框架,在这个 URL 中需要被替换的 BaseUrl 含有几个 pathSegments,相当于每个 URL 都可以指定自己需要被替换的 BaseUrl 的格式,这样就比高级模式只能在 App 初始化时,指定一个全局的 BaseUrl 格式灵活得多,如果当您开启高级模式的同时也开启了超级模式,由于超级模式的优先级高于高级模式,所以只会执行超级模式

超级模式的替换规则

  1. 旧 URL 地址为 "https://www.github.com/wiki/part#baseurl_path_size=1","#baseurl_path_size=1" 表示其中 BaseUrl 为 "https://www.github.com/wiki",您想替换成的 BaseUrl 地址是 "https://www.google.com/api",经过框架替换后生成的最终 URL 地址为 "http://www.google.com/api/part"

  2. 旧 URL 地址为 "https://www.github.com/wiki/part#baseurl_path_size=1","#baseurl_path_size=1" 表示其中 BaseUrl 为 "https://www.github.com/wiki",您想替换成的 BaseUrl 地址是 "https://www.google.com",经过框架替换后生成的最终 URL 地址为 "http://www.google.com/part"

  3. 旧 URL 地址为 "https://www.github.com/wiki/part#baseurl_path_size=0","#baseurl_path_size=0" 表示其中 BaseUrl 为 "https://www.github.com",您想替换成的 BaseUrl 地址是 "https://www.google.com/api",经过框架替换后生成的最终 URL 地址为 "http://www.google.com/api/wiki/part"

  4. 旧 URL 地址为 "https://www.github.com/wiki/part/issues/1#baseurl_path_size=3","#baseurl_path_size=3" 表示其中 BaseUrl 为 "https://www.github.com/wiki/part/issues",您想替换成的 BaseUrl 地址是 "https://www.google.com/api",经过框架替换后生成的最终 URL 地址为 "http://www.google.com/api/1"

三种模式比较

在升级之前,框架就只有一个默认的普通模式 (只能替换域名),在升级之后新增了 高级模式 和 超级模式,这两个模式让框架变得更加强大,在上面的内容中也详细的介绍了这两个模式,现在就来总结下这三个模式,让大家能够按照自己的需求选择出最适合的模式

替换 BaseUrl 的自由程度 (可扩展性)

普通模式 < 高级模式 < 超级模式

  • 普通模式: 只能替换域名

  • 高级模式: 只能替换在 RetrofitUrlManager#startAdvancedModel(String) 中传入的固定 BaseUrl 格式

  • 超级模式: 每个 URL 都可以随意指定可被替换的 BaseUrl 格式

使用上的复杂程度

普通模式 < 高级模式 < 超级模式

  • 普通模式: 无需做过多配置

  • 高级模式: 在 App 初始化时调用一次 RetrofitUrlManager#startAdvancedModel(String) 即可

  • 超级模式: 每个需要开启超级模式的 URL 尾部都需要加入 RetrofitUrlManager#IDENTIFICATION_PATH_SIZE (#baseurl_path_size=) + PathSize

总结

由此可见,自由度越强,使用上也越复杂,所以可以根据自己的需求选择对应的模式,并且也可以根据需求的变化随意升级或降级这三种模式

这次更新让 RetrofitUrlManager 的能力提升了一个档次,足以应对各种复杂的 BaseUrl 替换需求,正因为 RetrofitUrlManager 极强的扩展性,现在甚至可以做到,让服务器可以通过远程动态控制项目中的多个 BaseUrl

如果还有什么问题或者需求可以给我提 Issues,如果 RetrofitUrlManager 能够给您带来实质的帮助,也请不要吝啬您的 Star


Hello 我叫Jessyan,如果您喜欢我的文章,可以在以下平台关注我

– The end

Android代码-RetrofitUrlManager RetrofitUrlManager Let Retrofit support multiple baseUrl and can be change the baseUrl at runtime. 中文说明 Overview Notice Framework analysis 1 Framework analysis 2 More complete sample Download implementation 'me.jessyan:retrofit-url-manager:1.4.0' Usage Initialize // When building OkHttpClient, the OkHttpClient.Builder() is passed to the with() method to initialize the configuration OkHttpClient = RetrofitUrlManager.getInstance().with(new OkHttpClient.Builder()) 立即下载

相关推荐

SAP 更改物料基本计量单位

创建订单单位后,新创建的采购申请、采购合同、采购信息记录均会使用新的订单单位

matinal 當冬夜漸暖 。公众号:matinal 6162

Retrofit动态设置BaseUrl

Retrofit动态设置baseUrl有四种方式 需要使用带host的全路径,否则不会更改,只会和原拼接 正确使用示例 三. @url不改变baseUrl时的用法 像上面第二点说的,当不使用scheme+host全路径的用法时,我们在请求一些很长的url并且参数是固定的接口时,使用@url会很方便。 特别需要注意的是:当我们在结点url上添加一个前置 / 符号时,每个加到host Url后面的东西都会被省略掉。建议在使用@url时,不要在结点url添加前置 / 符号 。

闪亮的大早的博客 3577

ADS中HB仿真自动优化报错问题解决心得

在ADS HB仿真中自动优化出现报错被强制暂停,解决方法如下

yyyyyyyyyyjy的博客 6539

Retrofit存在多个BaseUrl,提供一种比较简单的方案

来源 这原本来自一个比较蛋疼的请求,项目中本来是一个BaseURL的天下,这几天突然要调用第三方的身份证调用接口,与现在的URL地址不一致,本想Copy一个Retrofit配置完事,但是马丹周五又来了一个第三方的查询接口,真是日了狗.(项目本是政府项目,存在很多规划问题),不能又拷一个配置吧,算了,就思考怎么写一个吧。 又加上在复习Retrofit的源码,发现存在一个比较简单的解决方案,就是在使用...

成长的烧年 5293

23数字图像置乱技术(matlab程序)

所谓“置乱”,就是将图像的信息次序打乱,a像素移动到b像素位置上,b像素移动到c像素位置上,……,使其变换成杂乱无章难以辨认的图片。数字图像置乱技术属于加密技术,是指发送发借助数学或者其他领域的技术,对一幅有意义的数字图像做变换,使之变成一幅杂乱无章的图像用于传输。在图像传输过程中,它通过对图像像素矩阵的重排,破坏了图像矩阵的相关性,使非法截获者无法从杂乱无章的图像中获得原图像信息,以此实现信息的加密。接收方经去乱解密可恢复原图像。

m0_57943157的博客 1208

【CarMaker实战指南】从零构建环形测试场景与车辆连续仿真

本文详细介绍了如何使用CarMaker软件从零构建环形测试场景与实现车辆连续仿真。通过分步指导搭建闭环道路、连接交叉路口、规划车辆轨迹等核心操作,帮助用户掌握CarMaker的基础应用技巧,并提供了常见问题排查与进阶优化建议,适用于车辆耐久性测试和自动驾驶算法验证等场景。

weixin_29274969的博客 234

android 动态切换url,RetrofitUrlManager 解决Retrofit多BaseUrl及运行时动态改变BaseUrl

RetrofitUrlManagerLet Retrofit support multiple baseUrl and can be change the baseUrl at runtime.OverviewIntroduction以最简洁的 Api 让 Retrofit 同时支持多个 BaseUrl 以及动态改变 BaseUrl.NoticeDownloadimplementation 'me...

weixin_42341237的博客 2258

zemax双透镜公差分析

蒙特卡罗分析: 评估公差的整体影响,模拟过程中产生一系列随机的lens,满足指定的公差,然后再按照标准评估。公差分析,就是在设计了一个理想的系统后,想看看实际生产过程中如果产生公差(误差),系统会坏到什么程度,也就是光学性能受到多大影响。反灵敏度分析:分别对每个公差在性能方面的一个给定的最小允许减少量来计算公差,也就是限制了系统性能的变化,和灵敏度分析方向相反。灵敏度分析对每个公差单独求值,分别计算每个公差操作数的最大、最小、标准值(如上图)所有设计上可能的公差都列出来了。注意要固定透镜的口径。

fendoudecheng的博客 3207

Retrofit 动态管理和修改BaseUrl,从未如此简单

1212

issingleman的博客 2836

在不同版本Python中安装PyQT5及PyQT5-Tools

在不同版本Python中安装PyQT5及PyQT5-Tools

zoomgu680的博客 2万+

Open Lovable 网站克隆AI工具超详细实战教程(含环境配置、排错与代码修改)

本教程面向有一定计算机基础的新手用户,提供一份全面、深入的 Open Lovable 使用指南。从开发环境搭建、API密钥获取、项目部署到网站克隆、代码下载、本地运行与二次开发,涵盖全流程细节与常见问题解决方案。通过本教程,新手可掌握如何利用AI驱动的Open Lovable工具,将任意目标网站智能复刻为结构清晰、可编辑的现代前端项目(React/Vite),实现快速原型开发与技术学习。

hy行者勇哥的博客 4962

【亲测免费】 RetrofitUrlManager 教程

**RetrofitUrlManager** 是一个轻量级库,专为安卓开发者设计,用于扩展 Retrofit 框架,使其能够支持多个基础 URL 并在运行时动态切换。这个库通过提供简洁的 API,使得管理不同场景下(如开发环境、测试环境、生产环境)的基础 URL 变得简单易行。 ## 2. 项目快速启动 ### 添加依赖 首先,在你的 `build.gradle` 文件中添加 Retrofi...

gitblog_00116的博客 490

拓竹P1S封神玩法|AI图生3D+精准修改全攻略,打孔/挖盖再也不用瞎琢磨!

AI图生3D建模结合后期修改,让拓竹P1S用户轻松实现创意打印。文章详细介绍了从照片拍摄、AI模型生成到后期修改的全流程:使用腾讯混元3D或Tripo3D快速生成3D模型,通过Blender或Fusion360进行精准打孔、挖盖子等修改,最后在OrcaSlicer中优化切片参数适配P1S打印。重点解决了AI模型无法直接打印的问题,提供了壁厚控制、孔径调整等实用技巧,并针对常见打印问题给出解决方案,帮助新手实现从AI生成到成品打印的无缝衔接。

2501_93651177的博客 1879

PGPortfolio未来展望:AI金融交易的发展趋势与技术前沿

PGPortfolio作为基于深度强化学习的金融投资组合管理框架,通过策略梯度方法为AI金融交易开辟了全新路径。该项目源自论文《A Deep Reinforcement Learning Framework for the Financial Portfolio Management Problem》,其核心优势在于将投资组合问题转化为即时奖励优化问题,兼顾交易成本正则化,实现了与监督学习相当的效

gitblog_00009的博客 526

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Retrofit(OKHttp)多BaseUrl情况下url实时自动替换完美解决方法

前言 多数项目中会出现用到多个BaseUrl的情况,而Retrofit未提供实时切换BaseUrl的方法,且我们在使用Retrofit以及OkHttp时,通常使用单例模式创建Retrofit和OkHttpClient,也不可能每个请求都创建一个Retrofit实例。面对这个实际问题,我们需要做的不仅仅是解决当前问题,更应该从根本上解决该问题,即实现任何情况下的自动切换BaseUrl。 主要用

xqkillua的专栏 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Retrofit解决使用多个BASE_URL的问题

private static RetrofitManager mRetrofitManager; private static String BASE_URL="http://www.zhaoapi.cn/"; private final BaseApis mBaseApis; private RetrofitManager() { OkHtt...

FanRQ_的博客 1452

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Retrofit 动态管理和修改 BaseUrl,从未如此简单,绝对干货分享

文章会持续更新的。绝对干货!!!Android进阶学习全套手册关于实战,我想每一个做开发的都有话要说,对于小白而言,缺乏实战经验是通病,那么除了在实际工作过程当中,我们如何去更了解实战方面的内容呢?实际上,我们很有必要去看一些实战相关的电子书。

2401_84149505的博客 1047

Retrofit 2 动态URL

问题使用Retrofit2一般都是针对于一baseURL,其它接口都是拼接不同的参数如get/photo,search?name=xiaohong&&sex=female,这样的形式。但是一些请求此时又要访问不同的url只能重新生成一个Retrofit2实例,实质上还有一种形式去处理,就是使用@url注解。解决方案public interface UserService { @GET

小小程序员 1万+

一 、retrofit的简单使用

1.代码 IGetRequest public interface IGetRequest { @GET("news/v2/sunweihao/269")//这里要自己可请求的url,这个不可用 Call<Translation> getCall(); } Translation,这就是bean类,可以配合Gson来进行解析 //缩略,自己得到json文件后,再来转bean MainActivity public class MainActivity extends AppC

sunweihao2019的博客 1327

RetrofitUrlManager 使用教程

本教程将引导你了解并开始使用 `RetrofitUrlManager`,这是一个让 Retrofit 支持多个基础 URL 并能在运行时动态切换的开源库。 ## 1. 项目目录结构及介绍 在克隆或下载项目后,你会看到以下主要的目录结构: ``` RetrofitUrlManager/ ├── app/ // 示例应用模块 │ ├── src/ │ │ └──...

gitblog_00996的博客 694

【亲测免费】 RetrofitUrlManager 常见问题解决方案

**RetrofitUrlManager** 是一个开源项目,旨在让 Retrofit 支持多个 BaseUrl 并在运行时动态改变 BaseUrl。该项目的主要编程语言是 Java,适用于 Android 开发环境。通过简单的 API 配置,开发者可以轻松地在 Retrofit 中管理多个 BaseUrl,并根据需要在运行时切换。 ## 新手使用注意事项及解决方案 ### 1. 初始化配置问...

gitblog_00892的博客 1186

Retrofit动态修改BaseUrl

1.初始化Retrofit2 private static RetrofitManager manager; private Retrofit retrofit; /** * 私有构造器 无法外部创建 * 初始化必要对象和参数 */ private RetrofitManager() { Cache cache = new Cache(new File(BaseApplication.getInstance().getCacheDir()

UrasakiNakajima的博客 1454
上一篇: MVPArms官方首发一键生成组件化,体验纯傻瓜式组件化开发
下一篇: 骚年你的屏幕适配方式该升级了!-今日头条适配方案
JessYanCoding
博客等级 码龄10年 63粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值