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

