You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:43:18