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

如何在OkHttp3中获取HTTP错误码并避免异常抛出?

OkHttp3获取非200状态码及指定WiFi网络的解决方案

一、解决非200状态码触发异常的问题

OkHttp默认不会针对HTTP非200系列状态码抛出异常,execute()方法会直接返回包含所有状态码的Response对象。你遇到的异常大概率来自网络连接失败、超时等场景,而非状态码本身。要获取任意状态码,只需直接读取响应对象的状态码字段即可:

修改你的代码逻辑,在响应处理块中先获取状态码,再按需分支处理:

okHttpClient.newCall(request).execute().use { response ->
    val statusCode = response.code
    Log.d(TAG, "响应状态码: $statusCode")
    Log.d(TAG, "Network response: ${response.networkResponse}")
    
    // 用isSuccessful判断200-299的成功状态码,其余按失败处理
    if (response.isSuccessful) {
        httpRequestResult.onSuccess(response.networkResponse.toString())
    } else {
        // 自定义非成功状态码的处理逻辑,比如回调失败方法
        httpRequestResult.onFailure("请求失败,状态码: $statusCode")
    }
}

如果你的代码确实因非200状态码抛出异常,请检查是否添加了自定义拦截器(比如强制对非200状态码抛异常的拦截器),或是httpRequestResult.onSuccess内部有状态码判断并抛出异常的逻辑。

二、指定WiFi网络的方案验证

你通过network.socketFactory绑定指定网络的方案是可行的,但需要补充几个关键细节:

  • 先校验当前网络是否为WiFi,避免误绑定到移动数据:
val isWifi = capabilities?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true
if (network != null && isWifi) {
    httpBuilder.socketFactory(network.socketFactory)
} else {
    // 处理非WiFi场景,比如提示用户切换网络,或使用默认网络
}
  • 确保申请必要权限:ACCESS_NETWORK_STATE,Android 10及以上还需ACCESS_FINE_LOCATION(用于精准识别WiFi网络)。
  • 避免使用network!!的非空断言,当WiFi断开时activeNetwork会变为null,建议用安全调用或空判断防止空指针异常。

内容的提问来源于stack exchange,提问作者theblitz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:12:22