Kotlin Ktor 无法获取具有位置数据 class 的 post 数据
Kotlin Ktor can't get post data with location data class
这是我的代码:
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
谁能帮帮我?
这是以相同方式处理所有参数(查询和 post)的不幸结果。这是固定的,现在应该明确接收 post 参数。这是有道理的,因为 location 是一个往返实体,就像你可以处理它并且你可以从中生成一个 URL ,它应该命中同一个处理程序。使用 POST 个参数是不可能的。
现在您需要从地图上手动 call.receive<ValuesMap>()
和获取 post 参数。类型化绑定正在开发中。
您可以在此处跟踪进度:https://github.com/Kotlin/ktor/issues/190
这是我的代码:
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
谁能帮帮我?
这是以相同方式处理所有参数(查询和 post)的不幸结果。这是固定的,现在应该明确接收 post 参数。这是有道理的,因为 location 是一个往返实体,就像你可以处理它并且你可以从中生成一个 URL ,它应该命中同一个处理程序。使用 POST 个参数是不可能的。
现在您需要从地图上手动 call.receive<ValuesMap>()
和获取 post 参数。类型化绑定正在开发中。
您可以在此处跟踪进度:https://github.com/Kotlin/ktor/issues/190