[英]Ktor-server RequestValidation not working
我正在使用 ktor (2.1.0) 創建一個小的 API。 在這樣做的同時,我正在嘗試利用 Ktor-server 很酷的功能,包括 RequestValidation。
話雖如此,它不起作用,我不知道為什么,因為它看起來非常接近文檔中的示例。
這是我的服務器配置:
embeddedServer(Netty, port = 8080) {
routing {
post("/stock") {
val dto = call.receive<CreateStockRequest>()
call.respond(HttpStatusCode.NoContent)
}
}
install(ContentNegotiation) {
json(Json {
prettyPrint = true
isLenient = true
})
}
install(StatusPages) {
exception<RequestValidationException> { call, cause ->
call.respond(HttpStatusCode.BadRequest, cause.reasons.joinToString())
}
}
install(RequestValidation) {
validate<CreateStockRequest> { request ->
if (request.name.isBlank())
ValidationResult.Invalid("Stock must have a name")
if (request.symbol.isBlank())
ValidationResult.Invalid("Symbol must have a name")
ValidationResult.Valid
}
}
}
這是“收到”的請求 object:
@Serializable
data class CreateStockRequest(val name: String, val symbol: String)
這是發送的正文:
{
"name": "",
"symbol": "something"
}
我期待收到一個BadRequest
響應,但我收到一個NoContent
響應,好像請求一切正常。
難道我做錯了什么?
在您的示例中,僅當“名稱”和“符號”均為空白時,服務器才使用BadRequest
響應。 您可以用when
表達式替換您的驗證邏輯:
validate<CreateStockRequest> { request ->
when {
request.name.isBlank() -> ValidationResult.Invalid("Stock must have a name")
request.symbol.isBlank() -> ValidationResult.Invalid("Symbol must have a name")
else -> ValidationResult.Valid
}
}
我發現公認的答案是一種更簡潔的代碼解決方案,這就是為什么它是公認的答案。
話雖如此,通過理解編譯器與范圍混淆,可以更好地解釋我遇到的實際問題。 在每個“if”子句中,我需要返回驗證結果,但編譯器沒有它。
原因是它與我的 return 聲明所引用的上下文混淆了。 我的解決方案是使用“@”符號來指定 scope 用於返回:
validate<CreateStockRequest> { request ->
if (request.name.isBlank())
return@validate ValidationResult.Invalid("Stock must have a name")
if (request.symbol.isBlank())
return@validate ValidationResult.Invalid("Symbol must have a name")
return@validate ValidationResult.Valid
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.