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

安卓开发中使用Retrofit如何捕获错误及获取请求URL排查问题

解决方案

一、查看完整请求URL及请求/响应详情

你需要接入OkHttp的日志拦截器来打印完整请求链路信息,包含完整URL、请求头、请求体、响应状态、响应体等内容,步骤如下:

  1. 先添加日志拦截器依赖(模块级build.gradle.kts)
dependencies {
    implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") // 可替换为当前最新稳定版本
}
  1. 修改你现有的Retrofit实例配置,注入自定义的OkHttpClient并添加拦截器:
@Singleton 
@Provides 
fun provideConverterApi(): ConverterAPI {
    // 配置日志拦截器
    val loggingInterceptor = HttpLoggingInterceptor().apply {
        // BODY级别会打印完整的请求、响应所有内容,适合调试阶段使用
        level = HttpLoggingInterceptor.Level.BODY
    }
    // 构建自定义OkHttpClient
    val okHttpClient = OkHttpClient.Builder()
        .addInterceptor(loggingInterceptor)
        // 还可以按需添加超时配置
        .connectTimeout(15, TimeUnit.SECONDS)
        .readTimeout(15, TimeUnit.SECONDS)
        .build()

    return Retrofit.Builder()
        .baseUrl(Constants.BASE_URL)
        // 绑定自定义的OkHttpClient
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create())
        .build()
        .create(ConverterAPI::class.java)
}

配置完成后所有请求的完整URL、参数等信息都会直接打印在Logcat中,过滤OkHttp标签即可查看。
注意:上线版本请关闭日志打印或者降低日志级别,避免泄露敏感信息。

二、获取网络请求错误信息

根据你使用的请求方式不同,捕获错误的方式分为两类:

1. 协程挂起函数请求(推荐)

直接用try-catch包裹请求代码,按错误类型分别处理即可:

viewModelScope.launch {
    try {
        val response = converterApi.getXXX() // 替换为你的接口请求方法
        // 处理正常响应
    } catch (e: IOException) {
        // 网络异常:无网络、连接超时、DNS解析失败等
        Log.e("网络错误", "网络连接失败: ${e.message}")
    } catch (e: HttpException) {
        // 请求已到达服务器,但返回非2xx状态码(404、500、401等)
        val errorCode = e.code() // 错误状态码
        val errorMessage = e.message() // 错误描述
        val errorBody = e.response()?.errorBody()?.string() // 服务器返回的错误体内容
        Log.e("请求错误", "错误码:$errorCode, 错误信息:$errorMessage, 错误体:$errorBody")
    } catch (e: Exception) {
        // 其他错误:比如JSON序列化失败、参数错误等
        Log.e("未知错误", "请求出错: ${e.message}")
    }
}

2. 传统Callback回调请求

在onFailure方法中直接获取错误信息:

converterApi.getXXX().enqueue(object : Callback<你的响应实体类> {
    override fun onResponse(call: Call<你的响应实体类>, response: Response<你的响应实体类>) {
        if (response.isSuccessful) {
            // 处理正常响应
        } else {
            // 非2xx状态码错误
            val errorCode = response.code()
            val errorBody = response.errorBody()?.string()
        }
    }

    override fun onFailure(call: Call<你的响应实体类>, t: Throwable) {
        // 网络异常等其他错误
        Log.e("请求失败", "错误信息: ${t.message}")
    }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:45:03