1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Retrofit(Okhttp)Dns解析服务器域名异常时尝试使用服务器IP访问

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

时间:2023-05-07 19:14:37

相关推荐

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("")) {"[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 {workLog() }}.apply {level = HttpLoggingInterceptor.Level.BODY })retryOnConnectionFailure(true)}.build()).addConverterFactory(ScalarsConverterFactory.create()).addConverterFactory(GsonConverterFactory.create()).build().create(ApiService::class.java)

原帖地址,转载请注明:/hx7013/article/details/111939812

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。