Android 动态域名管理

在 Android 应用中使用 动态域名 调用接口时,通常是为了灵活切换服务器地址(如多环境切换、灰度发布等)。以下是基于 Kotlin 和 OkHttp/Retrofit 的实现方案:

1. 动态域名管理类

创建一个单例类管理动态域名,支持实时更新:

object DynamicDomainManager {
    private var currentDomain: String = "https://default.domain.com" // 默认域名
    private val domainLock = ReentrantLock()

    fun getDomain(): String {
        return domainLock.withLock { currentDomain }
    }

    fun updateDomain(newDomain: String) {
        domainLock.withLock {
            currentDomain = newDomain
            // 可选:持久化到 SharedPreferences 或其他存储
        }
    }
}

2. OkHttp 动态域名拦截器

通过拦截器在请求发出前动态替换域名:

class DynamicDomainInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val originalRequest = chain.request()
        val newUrl = originalRequest.url.newBuilder()
            .host(DynamicDomainManager.getDomain().toHttpUrl().host) // 替换 Host
            .build()
        val newRequest = originalRequest.newBuilder()
            .url(newUrl)
            .build()
        return chain.proceed(newRequest)
    }
}

3. 配置 OkHttpClient

将拦截器添加到 OkHttpClient

val okHttpClient = OkHttpClient.Builder()
    .addInterceptor(DynamicDomainInterceptor())
    .build()

4. Retrofit 动态 BaseUrl 处理

如果使用 Retrofit,需动态设置 BaseUrl。使用 Retrofit.Builder 的 baseUrl 方法结合动态域名:

val retrofit = Retrofit.Builder()
    .baseUrl(DynamicDomainManager.getDomain()) // 初始域名
    .client(okHttpClient)
    .build()

// 动态更新 Retrofit 的 BaseUrl(需重新构建 Retrofit 实例)
fun updateRetrofitDomain(newDomain: String) {
    DynamicDomainManager.updateDomain(newDomain)
    // 重新初始化 Retrofit 实例
}

5. 动态域名更新触发

在需要更新域名的地方(如从接口获取最新域名):

 // 示例:从配置接口获取最新域名
    apiService.getConfig().enqueue(object : Callback<ConfigResponse> {
        override fun onResponse(call: Call<ConfigResponse>, response: Response<ConfigResponse>) {
            val newDomain = response.body()?.domain

            newDomain?.let { DynamicDomainManager.updateDomain(it) }

        }
        override fun onFailure(call: Call<ConfigResponse>, t: Throwable) {
            // 处理失败
        }
    })

注意事项

  1. 线程安全:确保多线程环境下域名更新的原子性(如使用锁)。

  2. HTTPS 证书:若动态域名使用不同证书,需配置 OkHttp 的 SSLContext

  3. 缓存清理:域名更新后,清理 OkHttp 的缓存(如连接池、DNS 缓存)。

  4. 兼容性:确保 Retrofit 的 @GET/@POST 注解使用相对路径(非完整 URL)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值