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

Android(Kotlin)中NewsApi无法显示错误消息问题求助

问题解决:Android调用NewsApi无法获取官方错误消息

问题根源:直接调用response.errorBody().toString()得到的是ResponseBody对象的内存引用,不是接口返回的实际错误内容。NewsApi的错误响应是标准JSON格式,必须解析成对应的数据类才能拿到官方错误信息。


解决步骤

1. 定义错误响应数据类

创建匹配NewsApi错误返回结构的数据类:

data class NewsErrorResponse(
    val status: String,
    val code: String,
    val message: String
)

NewsApi的错误返回格式示例:

{
  "status": "error",
  "code": "apiKeyExhausted",
  "message": "Your API key has expired or reached its request limit."
}

2. 正确解析错误响应体

修改ViewModel中的handleBreakingNewsResponse方法,用Gson解析错误体内容:

private fun handleBreakingNewsResponse(response: Response<NewsResponse>): Resource<NewsResponse> {
    if (response.isSuccessful) {
        // 原有成功逻辑保持不变
        response.body()?.let { resultResponse ->
            if (breakingNewsResponse == null) {
                breakingNewsResponse = resultResponse
            } else {
                val oldArticles = breakingNewsResponse?.articles
                val newArticles = resultResponse.articles
                oldArticles?.addAll(newArticles)
            }
            return Resource.Success(breakingNewsResponse ?: resultResponse)
        }
    }

    // 解析错误响应体
    val errorMsg = try {
        response.errorBody()?.string()?.let { errorJson ->
            Gson().fromJson(errorJson, NewsErrorResponse::class.java).message
        } ?: "未知错误"
    } catch (e: Exception) {
        "解析错误信息失败: ${e.message}"
    }
    return Resource.Error(errorMsg)
}

注意:errorBody().string()只能调用一次,ResponseBody的流会被消耗,需先转成字符串再解析。

3. 修正拦截器配置(可选)

你的RetrofitHelper中拦截器添加逻辑存在嵌套问题,调整顺序确保正常读取响应:

private fun httpclient(): OkHttpClient {
    val builder = OkHttpClient.Builder()

    // 添加日志拦截器
    builder.addInterceptor(HttpLoggingInterceptor().apply {
        setLevel(HttpLoggingInterceptor.Level.BODY)
    })
    // 添加Chucker拦截器
    builder.addInterceptor(
        ChuckerInterceptor.Builder(application_class.context)
            .collector(ChuckerCollector(application_class.context))
            .maxContentLength(250000L)
            .redactHeaders(emptySet())
            .alwaysReadResponseBody(false)
            .build()
    )
    return builder.build()
}

修改完成后,API KEY超限等异常场景下就能正确显示NewsApi返回的官方错误消息,不再出现乱码或无效内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:55:28