首页 > 解决方案 > 在 Ktor 中验证请求

问题描述

我有一个使用 Ktor 制作的 API,当请求的 som 字段失败时,它返回 500 错误,我想检查所有请求数据并返回,在本例中为 422。

请求类:

@Serializable
data class LoginRequest (
    val email: String,
    val password: String
)

路由

route("v1/auth/login") {
    post {
        val loginRequest = call.receive<LoginRequest>()
        //LOGIN METHOD
    }
}

现在 Ktor 显示的错误是:

[eventLoopGroupProxy-4-1] ERROR Application - Unhandled: POST - /v1/auth/login
kotlinx.serialization.MissingFieldException: Field 'password' is required for type with serial name

确保系统不会失败并以 BadRequest 响应的最佳方法是什么?

标签: validationkotlinrequestktor

解决方案


您可以使用默认值使字段为空,在null遇到未知属性时忽略错误并手动验证结果对象。这是一个例子:

import io.ktor.application.*
import io.ktor.features.*
import io.ktor.http.*
import io.ktor.request.*
import io.ktor.response.*
import io.ktor.routing.*
import io.ktor.serialization.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json

@Serializable
data class LoginRequest (
    val email: String? = null,
    val password: String? = null
)

suspend fun main() {
    embeddedServer(Netty, port = 8080) {
        install(ContentNegotiation) {
            json(Json {
                ignoreUnknownKeys = true
            })
        }

        routing {
            post("/") {
                val request = call.receive<LoginRequest>()

                if (request.email == null || request.password == null) {
                    call.respond(HttpStatusCode.UnprocessableEntity)
                    return@post
                }

                call.respond(HttpStatusCode.OK)
            }
        }
    }.start()
}

推荐阅读