在使用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相关推荐

  1. java 获取动态的service_【Android】动态代理在 Retrofit 中的使用

    首先,什么是动态代理和为什么会有动态代理. 众所周知,Java 是一门静态语言,编写完的类,无法在运行时做动态修改. 一个简单的动态代理如下: 1.先定义一个接口,想要使用动态代理,必须先定义一个接口 ...

  2. [配置]VUE中通过process.env判断开发,测试和生产环境,并分环境配置不同的URL HOST

    [配置]VUE中通过process.env判断开发,测试和生产环境,并分环境配置不同的URL HOST process.env是什么? process.env 是 Node.js 中的一个环境对象.其 ...

  3. 【Android Gradle 插件】build.gradle 中的 android 配置 ( 配置项 | compileSdkVersion 配置 | buildToolsVersion 配置 )

    文章目录 一.列举 build.gradle 中常用 android 模块配置 二.android 模块常用配置介绍 1.compileSdkVersion 配置 2.buildToolsVersio ...

  4. android 配置java_home_android – React Native:未设置JAVA_HOME,并且在PATH中找不到“java”命令...

    我已经按照官方 Getting Started一步一步地进行了操作.我从干净的linux安装开始,按照"使用本机代码构建项目"选项卡安装所需的一切.我还阅读了故障排除部分.我已经使 ...

  5. 2017 github 上android 源码(适合工作中开发)

    转载: http://blog.csdn.NET/a774057695/article/details/49889437 https://github.com/XinRan5312/Android-o ...

  6. SAP UI5 应用开发教程之五十四 - 如何将本地 SAP UI5 应用配置到本地 Fiori Launchpad 中的试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  7. Android琐碎知识点,不断更新中

    1.获得屏幕的高度和宽度 width=context,getResources().getDisplayMetrics().widthPixels; height=context.getResourc ...

  8. Mac下Android配置及unity3d的导出Android

    昨晚实在弄的太晚了,费尽脑汁才弄出来. ok,关于mac下的eclipse的安卓配置,我仅仅贴一个网址,就ok了 http://developer.android.com/sdk/index.html ...

  9. android 配置aspect_Android APP全面屏适配技术要点

    全面屏的概念 为什么先要解释一下全面屏,因为这个词在现在来讲就是一个伪命题.全面屏字面意思就是手机的正面全部都是屏幕,100%的屏占比.但是现在推出所谓"全面屏"手机的厂商没有一个 ...

最新文章

  1. opengl绘制长方体线框_OpenGL 绘制长方体 计算机图形学
  2. Python——有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
  3. sql语句优化(二)
  4. linux mysql服务基础操作(二)
  5. Python语法教程-基础语法01
  6. dhcp 配置及排错
  7. Ceilometer - Install the API behind mod_wsgi
  8. [XJTUSE编译原理] 第三章 上下文无关文法
  9. matlab 液压,基于MATLAB液压系统设计与仿真.doc
  10. 快快编程kkcoding/太戈编程Tiger AI答案库 (每月更新)第三期 答案仅供参考,不能保证100%的准确性
  11. 华为云服务器测试并用docker快速搭建2048网站
  12. arcos的matlab定义,想用matlab解一个带arccos的方程。可是结果好像没有解析解。求帮助解数值解...
  13. 关于SQL Server中left join on and 用法的介绍
  14. 使用超级表格快速创建在线表单(如问卷调查、报名表)
  15. 个人愚见: React 和 Vue 区别
  16. 大数据清洗与预算第三章
  17. 视频旋转方向,让视频画面旋转90度播放
  18. CCED2000后,中文编程软件再次脱颖而出,系出金山
  19. ntd-desgin-vue中的时间插件默认值显示Invalid date 解决办法
  20. matlab中文论坛

热门文章

  1. Android 获取手机号及运营商信息
  2. cts测试之安装编译的APK出现DEXPREOPT报错
  3. 阿里开源 iOS 协程开发框架 coobjc源码分析
  4. 2017,互联网出海应该注意哪些问题?
  5. Java8 本地DateTime API
  6. 在 Windows 上安装Rabbit MQ 指南
  7. LCA在线算法ST算法
  8. 程序员的职业素养---编码
  9. Windows 部署服务(WDS)基础配置指南 (2008 or 2008R2 Only)
  10. 一些经常会用到的Javascript检测函数