如何在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
相关产品推荐
相关产品推荐

