From 8e8ab6936c08b534f1ce15609b1b783fd2c21a1c Mon Sep 17 00:00:00 2001 From: mazengfei <331023091@qq.com> Date: Tue, 28 Jul 2026 19:45:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(net):=20=E4=BC=98=E5=8C=96=20HttpException?= =?UTF-8?q?=20=E9=94=99=E8=AF=AF=E6=B6=88=E6=81=AF=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加从 HttpException 错误响应体解析后台业务 msg 的扩展方法 - 优先使用后台返回的业务 msg,失败时回退到 HTTP 状态短语 - 处理解析过程中可能出现的异常,确保安全降级 - 添加相关注释说明业务错误消息提取的设计意图 --- .../scalefusion/shelf/net/BaseRepository.kt | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) 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