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

Kotlin+Retrofit+协程+MVVM架构下如何正确获取服务端API返回的错误信息

你的问题根源是myDataResponse.message()获取的是HTTP协议自带的状态描述,并非接口响应Body中自定义的错误信息,服务端返回的错误结构存放在Response的errorBody属性中,你需要手动解析该属性拿到自定义错误内容。

实现步骤

1. 定义错误响应数据类

新增数据类匹配服务端返回的错误结构:

data class ErrorResponse(
    val message: String? = null
)

2. 新增错误体解析工具方法

使用你项目的JSON解析库(示例用Gson,可替换为Moshi等其他库),封装Response的错误体解析逻辑:

fun <T> Response<T>.parseErrorMsg(): String? {
    return try {
        val errorJson = errorBody()?.string() ?: return null
        Gson().fromJson(errorJson, ErrorResponse::class.java).message
    } catch (e: Exception) {
        // 解析失败返回null,后续兜底用HTTP默认描述
        null
    }
}

3. 修改响应处理逻辑

调整handleMyDataResponse方法中错误分支的取值逻辑:

private fun handleMyDataResponse(myDataResponse: Response<DataResponse>): HandleResource<DataResponse>? {
    if (myDataResponse.isSuccessful) {
        myDataResponse.body()?.let { myDataData ->
            return HandleResource.Success(myDataData)
        }
    }
    // 优先取服务端自定义错误信息,兜底用HTTP默认状态描述
    val errorMsg = myDataResponse.parseErrorMsg() ?: myDataResponse.message()
    return HandleResource.Error(errorMsg)
}
优化建议
  • 可将上述错误解析逻辑封装到全局Retrofit拦截器、基类ViewModel或者扩展函数中,避免每个接口重复编写
  • 如果HandleResource.Error支持传递异常对象,可将解析过程的异常同步传入,方便开发阶段排查问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:57:03