2017-09-23 1 views
0

Je suis nouveau à Java et Kotlin, en essayant de construire un formulaire de contact avec Ktor, donc je permis à la connexion non sécurisée de mon gmail de here, et construit l'application ci-dessous:Réception formulaire params au serveur Ktor

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("[email protected]", "my_gmil_passoword")) 
       setSSLOnConnect(true) 
       setFrom("[email protected]") 
       setSubject("subject")  // I need to use formParam 
       setMsg("message")   // I need to use formParam 
       addTo("[email protected]") 
      }.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) } } 
} 

et les choses bien passé avec elle, j'étais ble d'envoyer un e-mail pour me rediriger ensuite vers la page de succès, mais le message est passé envoyé est avec des données pré-set:

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

comment puis-je faire la Ktor recevoir les données que l'utilisateur vraiment entré sous la forme, comment puis-je lire les params de formulaire?

Répondre

3

Vous pouvez utiliser call.receive<ValuesMap>() et introspect les données:

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 { ... } 
     } 

REMARQUE: ValuesMap est dépréciée dans le dernier la version, donc utilisez le code suivant:

val post = call.receiveParameters() 
+0

Merci, pouvez-vous aider ici: https : //stackoverflow.com/questions/46500030/form-authentication-in-ktor –