我是Ktor的新手,我有一个带有请求体的路由,我正在使用Kotlin Serialization进行解析。
我知道请求主体应该符合请求主体数据类,但后来,我在测试负载中传递了错误的字段,导致应用程序崩溃。
我希望能够处理这样的场景,并向客户回应这样的字段是不允许的。我该怎么办。
这是我的示例数据类:
@kotlinx.serialization.Serializable
data class UserLoginDetails(
var email: String = "",
var password: String = ""
)
这是路线:
post("/user/login") {
val userInfo = call.receive<UserLoginDetails>()
//my code here
}
下面的有效载荷工作
{
"email": "test@email.com",
"password": "password"
}
但如果使用替代有效载荷,例如:
{
"phone": "test@email.com",
"password": "password"
}
应用程序崩溃,并显示崩溃消息:
kotlin.serialization.json.internal.JsonDecodingException:意外偏移量为7的JSON令牌:遇到未知密钥"emai"。使用"Json{}"生成器中的"ignoreUnknownKeys=true"将忽略未知键。
Ktor中有两个选项:
call.receive
是可以抛出异常的函数。在这种情况下,您可以简单地捕获它:
try {
val userInfo = call.receive<UserLoginDetails>()
} catch (t: Throwable) {
// handle error
}
- 使用状态页全局捕获异常:
install(StatusPages) {
exception<SerializationException> { cause ->
call.respond(/* */)
}
}
错误消息说,您可以在创建Json对象的配置ignoreUnknownKeys = true
中设置Json。这是文档链接。
提示:您可能还想检查其他配置选项,这样就可以避免将空字符串设置为默认值。