android配置多个url,Retrofit中使用多个baseUrl
在使用Retrofit之前需要进行Retrofit的创建,如下:
return Retrofit.Builder()
.baseUrl(NetClient.getInstance().getNetConfig().baseUrl)
.client(NetClient.getInstance().getHttpClient())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
这个创建过程是通过Builder进行的,如果项目中需要使用多个baseUrl,就没办法使用类似setBaseUrl的方法进行修改
那你能帮帮我吗?
1.可以使用@url注解直接进行url的设置,不使用baseurl
缺点:繁琐
优点:直接
2.使用临时header在拦截器中拼接不同的url
优点:一次修改,方便扩展,方便使用
具体做法:
1.首先需要定义一个Map来保存和标记不同的baseurl,如:
private val url = hashMapOf(
Pair("v", "https://x.xxxxxx.com")
, Pair("wx", "https://wx.xxxxxxx.com")
, Pair("im", "https://im.xxxxxx.com")
, Pair("ws", "wss://xxxx.xxxx.com/ws")
)
而且可以定义多个map用来切换不同的网络环境
2.在retrofit的具体请求接口中使用header进行标记,如:
@Headers("url_name:v")//这个对应了上面map中的key,url_name是随便定义的,但是后面要用到
3.在http拦截器中进行处理,具体的方法如下:
override fun intercept(chain: Interceptor.Chain): Response {
//获取request
val request = chain.request()
//获取request的创建者builder
val builder = request.newBuilder()
//从request中获取headers,通过给定的键url_name
val headerValues = request.headers("url_name")
if (headerValues.size > 0) {
//如果有这个header,先将配置的header删除,因此header仅用作app和okhttp之间使用
builder.removeHeader(NetConfig.HEADER_KEY)
//匹配获得新的BaseUrl
val headerValue = headerValues[0]
val newBaseUrl = getNewBaseUrl(headerValue)
//从request中获取原有的HttpUrl实例oldHttpUrl
val oldHttpUrl = request.url()
//重建新的HttpUrl,修改需要修改的url部分
var newFullUrl:HttpUrl? = null
//如果定义的map中存在这个url,就构建新的url,否则直接进行请求
if (newBaseUrl != null) {
val urlBuilder = oldHttpUrl.newBuilder()//使用旧的url构建一个新的Builder
newFullUrl = urlBuilder
.scheme(newBaseUrl.scheme())
.host(newBaseUrl.host())
.port(newBaseUrl.port()).build()//修改url的协议,域名,端口为新的url,可以根据自己的需求修改其他部分比如path,params
return chain.proceed(builder.url(newFullUrl!!).build())
}else{
chain.proceed(request)
}
}
}
//从定义好的map中获取对应的url
private fun getNewBaseUrl(headerValue: String): HttpUrl? {
return if (NetConfig.urlMap[headerValue] != null) {
HttpUrl.parse(NetConfig.urlMap[headerValue]!!)!!
} else null
}
android配置多个url,Retrofit中使用多个baseUrl相关推荐
- java 获取动态的service_【Android】动态代理在 Retrofit 中的使用
首先,什么是动态代理和为什么会有动态代理. 众所周知,Java 是一门静态语言,编写完的类,无法在运行时做动态修改. 一个简单的动态代理如下: 1.先定义一个接口,想要使用动态代理,必须先定义一个接口 ...
- [配置]VUE中通过process.env判断开发,测试和生产环境,并分环境配置不同的URL HOST
[配置]VUE中通过process.env判断开发,测试和生产环境,并分环境配置不同的URL HOST process.env是什么? process.env 是 Node.js 中的一个环境对象.其 ...
- 【Android Gradle 插件】build.gradle 中的 android 配置 ( 配置项 | compileSdkVersion 配置 | buildToolsVersion 配置 )
文章目录 一.列举 build.gradle 中常用 android 模块配置 二.android 模块常用配置介绍 1.compileSdkVersion 配置 2.buildToolsVersio ...
- android 配置java_home_android – React Native:未设置JAVA_HOME,并且在PATH中找不到“java”命令...
我已经按照官方 Getting Started一步一步地进行了操作.我从干净的linux安装开始,按照"使用本机代码构建项目"选项卡安装所需的一切.我还阅读了故障排除部分.我已经使 ...
- 2017 github 上android 源码(适合工作中开发)
转载: http://blog.csdn.NET/a774057695/article/details/49889437 https://github.com/XinRan5312/Android-o ...
- SAP UI5 应用开发教程之五十四 - 如何将本地 SAP UI5 应用配置到本地 Fiori Launchpad 中的试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
- Android琐碎知识点,不断更新中
1.获得屏幕的高度和宽度 width=context,getResources().getDisplayMetrics().widthPixels; height=context.getResourc ...
- Mac下Android配置及unity3d的导出Android
昨晚实在弄的太晚了,费尽脑汁才弄出来. ok,关于mac下的eclipse的安卓配置,我仅仅贴一个网址,就ok了 http://developer.android.com/sdk/index.html ...
- android 配置aspect_Android APP全面屏适配技术要点
全面屏的概念 为什么先要解释一下全面屏,因为这个词在现在来讲就是一个伪命题.全面屏字面意思就是手机的正面全部都是屏幕,100%的屏占比.但是现在推出所谓"全面屏"手机的厂商没有一个 ...
最新文章
- opengl绘制长方体线框_OpenGL 绘制长方体 计算机图形学
- Python——有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- sql语句优化(二)
- linux mysql服务基础操作(二)
- Python语法教程-基础语法01
- dhcp 配置及排错
- Ceilometer - Install the API behind mod_wsgi
- [XJTUSE编译原理] 第三章 上下文无关文法
- matlab 液压,基于MATLAB液压系统设计与仿真.doc
- 快快编程kkcoding/太戈编程Tiger AI答案库 (每月更新)第三期 答案仅供参考,不能保证100%的准确性
- 华为云服务器测试并用docker快速搭建2048网站
- arcos的matlab定义,想用matlab解一个带arccos的方程。可是结果好像没有解析解。求帮助解数值解...
- 关于SQL Server中left join on and 用法的介绍
- 使用超级表格快速创建在线表单(如问卷调查、报名表)
- 个人愚见: React 和 Vue 区别
- 大数据清洗与预算第三章
- 视频旋转方向,让视频画面旋转90度播放
- CCED2000后,中文编程软件再次脱颖而出,系出金山
- ntd-desgin-vue中的时间插件默认值显示Invalid date 解决办法
- matlab中文论坛