如何从Ktor的ClientRequestException中提取服务端错误信息?
从Ktor的ClientRequestException中提取服务端错误信息
当你在Ktor客户端中设置expectSuccess = true时,非2xx的响应会抛出ClientRequestException(针对4xx错误)或ServerResponseException(针对5xx错误)。要提取服务端返回的原始错误信息,可以通过以下步骤操作:
1. 解析为对应的数据类(推荐方式)
首先定义一个和服务端错误响应结构匹配的数据类:
import kotlinx.serialization.Serializable @Serializable data class ErrorResponse( val message: String, val code: Int )
确保你的HttpClient已经安装了Json序列化插件(默认Ktor会集成,若未显式配置需添加):
import io.ktor.client.HttpClient import io.ktor.client.plugins.json.JsonPlugin import io.ktor.client.plugins.json.serializer.KotlinxSerializer val client = HttpClient { expectSuccess = true install(JsonPlugin) { serializer = KotlinxSerializer() } }
在捕获异常时,直接通过response.body<T>()解析为数据类:
try { // 执行你的请求逻辑,例如: // val response = client.post("http://10.0.2.2:8080/account/signup") { ... } } catch (e: ClientRequestException) { val errorResponse = e.response.body<ErrorResponse>() // 直接使用错误信息 println("错误提示:${errorResponse.message}") println("错误码:${errorResponse.code}") }
2. 直接解析为JSON对象(无需数据类)
如果不想定义数据类,可以直接将响应体解析为JsonObject:
import kotlinx.serialization.json.JsonObject catch (e: ClientRequestException) { val errorJson = e.response.body<JsonObject>() val errorMessage = errorJson["message"]?.toString()?.removeSurrounding("\"") val errorCode = errorJson["code"]?.toString()?.toIntOrNull() errorMessage?.let { println("错误提示:$it") } errorCode?.let { println("错误码:$it") } }
3. Fallback:读取原始文本
如果服务端返回的不是JSON格式,或者解析失败,可以直接读取响应体的原始文本:
catch (e: ClientRequestException) { val rawErrorText = e.response.bodyAsText() println("原始错误响应:$rawErrorText") }
注意事项
- 必须确保HttpClient配置了Json序列化插件,否则无法将响应体解析为JSON结构
- 解析过程中可能出现格式不匹配的异常,建议在内部添加异常捕获逻辑,避免程序崩溃
内容的提问来源于stack exchange,提问作者anonuser1234
相关产品推荐
相关产品推荐

