安卓开发中使用Retrofit如何捕获错误及获取请求URL排查问题
解决方案
一、查看完整请求URL及请求/响应详情
你需要接入OkHttp的日志拦截器来打印完整请求链路信息,包含完整URL、请求头、请求体、响应状态、响应体等内容,步骤如下:
- 先添加日志拦截器依赖(模块级build.gradle.kts)
dependencies { implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") // 可替换为当前最新稳定版本 }
- 修改你现有的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
相关产品推荐
相关产品推荐

