如何在Retrofit中动态处理接口返回的错误信息?
Retrofit 动态错误处理实现方案
1. 定义通用错误数据类
针对服务器返回的动态错误字段,我们用Map<String, List<String>>来接收errors节点的内容,这样无需为每个API单独创建错误实体类:
data class ApiErrorResponse( val message: String?, val errors: Map<String, List<String>>? )
2. 修改NetworkResponse类实现动态解析
在你的NetworkResponse类中,针对验证错误(比如422状态码),通过Gson解析响应体的错误内容,提取所有动态错误信息并整理成用户可读的格式:
open class NetworkResponse<T>(private val response: Response<T>) { private val gson = Gson() fun generalNetworkResponse(): NetworkRequest<T> { return when { response.code() == 401 -> NetworkRequest.Error("You are not authorized") response.code() == 422 -> { // 处理动态验证错误 val errorBody = response.errorBody()?.string() val apiError = errorBody?.let { gson.fromJson(it, ApiErrorResponse::class.java) } // 拼接所有错误信息(可根据需求调整格式) val errorMessage = apiError?.errors?.entries?.joinToString("\n") { entry -> "${entry.key}: ${entry.value.joinToString(", ")}" } ?: apiError?.message ?: "Validation error occurred" NetworkRequest.Error(errorMessage) } response.code() == 500 -> NetworkRequest.Error("Try again") response.isSuccessful -> NetworkRequest.Success(response.body()!!) else -> NetworkRequest.Error(response.message()) } } }
3. 关键逻辑说明
- 动态适配:
Map<String, List<String>>可以接收任意字段名的错误集合,完全适配不同API的错误返回格式。 - 容错处理:对
errorBody、解析结果做多层空判断,避免空指针异常,同时提供默认错误提示兜底。 - 格式灵活:如果不需要显示字段名,可改用
apiError?.errors?.values?.flatten()?.joinToString("\n")直接拼接所有错误内容。
内容的提问来源于stack exchange,提问作者Hasan hastam
相关产品推荐
相关产品推荐

