接收形式参数到Ktor服务器

我是Java和Kotlin的新手,试图与Ktor建立一个联系表格,所以我从这里启用了我的Gmail的不安全连接,并构建了下面的应用程序:

blogApp.kt

 package blog import org.jetbrains.ktor.netty.* import org.jetbrains.ktor.routing.* import org.jetbrains.ktor.application.* import org.jetbrains.ktor.features.* import org.jetbrains.ktor.host.* import org.jetbrains.ktor.http.* import org.jetbrains.ktor.response.* import org.apache.commons.mail.* fun Application.module() { install(DefaultHeaders) install(CallLogging) install(Routing) { get("/") { call.respondText(""" My Example Blog2 <form action="/contact-us" method="post"> <input name="subject" placeholder="Subject"> <br> <textarea name="message" placeholder="Your message ..."></textarea> <br> <button>Submit</button> </form> """, ContentType.Text.Html) } post("/contact-us") { SimpleEmail().apply { setHostName("smtp.gmail.com") setSmtpPort(465) setAuthenticator(DefaultAuthenticator("my_alias@gmail.com", "my_gmil_passoword")) setSSLOnConnect(true) setFrom("my_alias@gmail.com") setSubject("subject") // I need to use formParam setMsg("message") // I need to use formParam addTo("my_alias@gmail.com") }.send() // will throw email-exception if something is wrong call.respondRedirect("/contact-us/success") } get("/contact-us/success") { call.respondText("Your message was sent", ContentType.Text.Html) } } } fun main(args: Array<String>) { embeddedServer(Netty, 8080, watchPaths = listOf("BlogAppKt"), module = Application::module).start() } 

build.gradle

 group 'Example' version 'alpha' buildscript { ext.kotlin_version = '1.1.4-3' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } apply plugin: 'java' apply plugin: 'kotlin' sourceCompatibility = 1.8 ext.ktor_version = '0.4.0' repositories { mavenCentral() maven { url "http://dl.bintray.com/kotlin/ktor" } maven { url "https://dl.bintray.com/kotlin/kotlinx" } } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" compile "org.jetbrains.ktor:ktor-core:$ktor_version" compile "org.jetbrains.ktor:ktor-netty:$ktor_version" compile "org.apache.commons:commons-email:1.4" compile "org.slf4j:slf4j-simple:1.7.25" compile "ch.qos.logback:logback-classic:1.2.1" testCompile group: 'junit', name: 'junit', version: '4.12' } compileKotlin { kotlinOptions.jvmTarget = "1.8" } compileTestKotlin { kotlinOptions.jvmTarget = "1.8" } kotlin { experimental { coroutines "enable" } } jar { baseName 'abc' manifest { attributes 'Main-Class': 'blog.BlogAppKt' } from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } } 

而且事情顺利的话,我可以给自己发一封电子邮件,然后重定向到成功页面,但发送的信息是预设的数据:

  setSubject("subject") // I need to use formParam setMsg("message") // I need to use formParam 

我怎样才能让Ktor收到用户真正输入的数据,怎样才能读取表单参数?

您可以使用call.receive<ValuesMap>()并反思数据:

 import org.jetbrains.ktor.request.* // for recieve import org.jetbrains.ktor.util.* // for ValuesMap post("/contact-us") { val post = call.receive<ValuesMap>() val subj = post["subject"] val msg = post["message"] SimpleEmail().apply { ... } }