fix(net): 优化 HttpException 错误消息解析逻辑

- 添加从 HttpException 错误响应体解析后台业务 msg 的扩展方法
- 优先使用后台返回的业务 msg,失败时回退到 HTTP 状态短语
- 处理解析过程中可能出现的异常,确保安全降级
- 添加相关注释说明业务错误消息提取的设计意图
This commit is contained in:
mazengfei
2026-07-28 19:45:00 +08:00
parent 23d211bfdb
commit 8e8ab6936c
@@ -1,6 +1,7 @@
package com.sw.scalefusion.shelf.net
import android.util.Log
import com.google.gson.Gson
import com.google.gson.JsonParseException
import retrofit2.HttpException
import java.io.IOException
@@ -16,7 +17,9 @@ abstract class BaseRepository {
Log.e("BaseRepository","safeApiCall Exception: ${e.stackTraceToString()}")
when (e) {
is HttpException -> {
ApiResponse(code = "${e.code()}", msg = e.message())
// 优先解析错误响应体中后台返回的业务 msg,解析失败再回退到 HTTP 状态短语
val bodyMsg = e.parseApiMessage()
ApiResponse(code = "${e.code()}", msg = bodyMsg ?: e.message())
}
is SocketTimeoutException -> {
@@ -45,4 +48,19 @@ abstract class BaseRepository {
}
}
}
/**
* 从 HttpException 的错误响应体中解析后台返回的业务 msg。
* 后端业务错误通常以非 2xx 状态码返回,body 仍为 {"code":...,"msg":...,"data":...} 结构,
* 此处提取 msg 供上层 toast 直接展示;解析失败返回 null,由调用方回退到 HTTP 状态短语。
*/
private fun HttpException.parseApiMessage(): String? {
return try {
val raw = response()?.errorBody()?.string() ?: return null
val parsed = Gson().fromJson(raw, ApiResponse::class.java)
parsed?.msg
} catch (_: Exception) {
null
}
}
}