Kotlin Android中OkHTTP GET请求无法解析域名问题求助
解决OkHTTP调用API时出现的「Unable to resolve host」错误
问题重现
调用https://api.api-ninjas.com/v1/city?name=Moscow时触发错误:
Message: Unable to resolve host "api.api-ninjas.com": No address associated with hostname
Postman测试请求正常,且API密钥正确,该请求曾在其他网络环境下成功,怀疑是当前网络或设备配置问题。
排查与解决方案
1. 确认应用网络权限
若为Android应用,检查AndroidManifest.xml是否添加了必要的网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
Android 10及以上版本,若应用在后台发起请求,还需补充相关配置:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <application ... android:usesCleartextTraffic="true">
2. 验证设备DNS解析能力
在设备上执行DNS解析测试:
- 通过ADB shell运行:
nslookup api.api-ninjas.com - 若返回「unknown host」,说明设备当前DNS无法解析该域名,可尝试切换公共DNS(如8.8.8.8、1.1.1.1)。
3. 排查网络环境限制
当前网络可能存在防火墙、代理拦截,或运营商DNS污染:
- 切换至其他网络(如手机热点)重新测试请求
- 检查设备是否开启了代理,若开启则关闭后重试
4. 给OkHTTP客户端指定自定义DNS
若设备默认DNS异常,可在OkHTTP配置中手动指定DNS服务器:
val client = OkHttpClient.Builder() .dns(Dns { hostname -> // 使用谷歌公共DNS解析 val dnsServer = InetAddress.getByName("8.8.8.8") val resolver = java.net.DnsResolver.Builder() .nameserver(dnsServer) .build() resolver.resolve(hostname).toList() }) .build()
5. 修复代码中响应体重复读取问题
你的代码中存在响应体重复读取的错误:先调用response.body?.string(),之后又调用response.body?.byteStream(),但OkHTTP响应体只能读取一次,第二次调用会返回空。建议使用JSON解析库(如Gson、Moshi)直接解析响应字符串:
// 定义数据类匹配API返回结构 data class City(val latitude: Int, val longitude: Int) // 修改onResponse方法 override fun onResponse(call: Call, response: Response) { Log.d("RESPONSE", response.code.toString()) Log.d("RESPONSE_HEADERS", response.headers.toString()) val responseBodyString = response.body?.string() ?: "" Log.d("RESPONSE_BODY", responseBodyString) response__ = response // 用Gson解析响应内容 val gson = Gson() val cities = gson.fromJson<List<City>>( responseBodyString, object : TypeToken<List<City>>() {}.type ) latitude = cities.firstOrNull()?.latitude ?: 0 longitude = cities.firstOrNull()?.longitude ?: 0 }
内容的提问来源于stack exchange,提问作者CHEYSOFF
相关产品推荐
相关产品推荐

