Retrofit(Okhttp)Dns解析服务器域名异常时尝试使用服务器IP访问

小公司,免费的Dns解析,有几率遇到域名解析异常(UnknownHostException),但通过IP访问又不方便(比如热备切换后,若IP变化,APP会直接连不上)。这里提供一种域名+IP的解析方法。

Okhttp其实已经提供了Dns解析方法

ApiDns

class ApiDns private constructor() : Dns {
    override fun lookup(hostname: String): List<InetAddress> {
        return try {
            //尝试系统默认解析
            Dns.SYSTEM.lookup(hostname)
        } catch (e: UnknownHostException) {
            //这里的hostname.contains,包含的是服务器域名
            if (hostname.contains("xxxx.com")) {
                "[DNS] $hostname 解析异常,尝试使用IP = $SERVER_IP".errorLog()
                InetAddress.getAllByName(SERVER_IP).asList()
            } else {
                throw e
            }
        }
    }

    companion object {
        // 这个值可以在网络正常时从服务器更新下来,SP、MMKV、SQL等保存在本地,随时更新
        private const val SERVER_IP = "47.xxx.xxx.88"

        val INSTANCE: ApiDns by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { ApiDns() }
    }
}

然后在Okhttp里引用就行了

 Retrofit.Builder()
            .baseUrl(url)
            .client(OkHttpClient.Builder().apply {
                // 主要是这行
                dns(ApiDns.INSTANCE)
                connectTimeout(20, TimeUnit.SECONDS)
                readTimeout(20, TimeUnit.SECONDS)
                writeTimeout(20, TimeUnit.SECONDS)
                addInterceptor(
                    HttpLoggingInterceptor { message ->
                        takeIf { AppUtils.isAppDebug() }?.let { message.networkLog() }
                    }.apply { level = HttpLoggingInterceptor.Level.BODY })
                retryOnConnectionFailure(true)
            }.build())
            .addConverterFactory(ScalarsConverterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)

原帖地址,转载请注明:https://blog.csdn.net/hx7013/article/details/111939812

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值