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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:15:02