Получение параметров формы на сервер 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 { ... } }