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

