KotlinKtor无法使用位置数据类获取帖子数据

vuktfyat  于 2022-11-16  发布在  Kotlin
关注(0)|答案(2)|浏览(106)

这是我的代码:

package com.example.ktordemo

import org.jetbrains.ktor.application.Application
import org.jetbrains.ktor.application.install
import org.jetbrains.ktor.application.log
import org.jetbrains.ktor.auth.UserHashedTableAuth
import org.jetbrains.ktor.features.CallLogging
import org.jetbrains.ktor.features.ConditionalHeaders
import org.jetbrains.ktor.features.DefaultHeaders
import org.jetbrains.ktor.features.PartialContentSupport
import org.jetbrains.ktor.locations.*
import org.jetbrains.ktor.response.*
import org.jetbrains.ktor.routing.*
import org.jetbrains.ktor.util.decodeBase64
import org.slf4j.Logger

@location("/login")
data class Login(val userId: String = "", val password: String = "", val error: String = "")

@location("/userTable") class SimpleUserTable

val hashedUserTable = UserHashedTableAuth(table = mapOf(
        "test" to decodeBase64("VltM4nfheqcJSyH887H+4NEOm2tDuKCl83p5axYXlF0=")
))

fun Application.basicAuth() {
    install(DefaultHeaders)
    install(CallLogging)
    install(ConditionalHeaders)
    install(PartialContentSupport)
    install(Locations)
    install(Routing) {
        manual(log)
    }
}

fun Route.manual(log: Logger) {
    post<Login> {
        log.info(it.toString())
        call.respond(it.userId) // get nothing
    }
    get { login: Login ->
        call.respond("login page")
    }
}

我用失眠测试要求,这是结果:

> POST /login HTTP/1.1
> Host: localhost:8080
> User-Agent: insomnia/5.6.3
> Accept: */*
> Accept-Encoding: deflate, gzip
> Content-Type: application/x-www-form-urlencoded
> Content-Length: 33
| userId=username&password=password

< HTTP/1.1 200 OK
< Date: Sun, 27 Aug 2017 16:52:20 GMT
< Server: ktor-core/0.4.0 ktor-core/0.4.0
< Content-Type: text/plain; charset=UTF-8
< Content-Length: 0

有人能帮我吗?

f1tvaqid

f1tvaqid1#

这是以相同方式处理所有参数(query和post)的一个不幸的后果。这个问题已经修复,现在应该显式地接收post参数。这是有意义的,因为位置是一个往返实体,就像你可以处理它,你可以从它生成一个URL,它应该命中同一个处理程序。使用POST参数,这是不可能的。
现在你需要从Map中手动地call.receive<ValuesMap>()和获取post参数。类型化绑定正在进行中。
您可以在此处跟踪进度:https://github.com/Kotlin/ktor/issues/190

ddrv8njm

ddrv8njm2#

Fun Route.manual(日志:记录器){

location<Login> { //must work
    method(HttpMethod.Post) {
        handle {
            log.info(it.toString())
            call.respond(it.userId)
        }
    }
}
get { login: Login ->
    call.respond("login page")
}

相关问题