diff --git a/app/src/main/java/com/sw/scalefusion/shelf/net/BaseRepository.kt b/app/src/main/java/com/sw/scalefusion/shelf/net/BaseRepository.kt index ab73d58..18039de 100644 --- a/app/src/main/java/com/sw/scalefusion/shelf/net/BaseRepository.kt +++ b/app/src/main/java/com/sw/scalefusion/shelf/net/BaseRepository.kt @@ -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 + } + } } \ No newline at end of file