簡體   English   中英

Ktor 服務器請求驗證不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM