You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:30:07