无法使用Kotlin将主体发布到Spark REST API

时间:2017-03-22 02:16:55

标签: json rest gradle kotlin spark-java

我正在尝试关注this Spark tutorial to create a REST API using Kotlin,而我正在努力在JSON主体上发布数据

我想将数据发布到正文中,如下所示:

curl -H "Content-Type: application/json" -X POST -d '{"token" : "eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vdHJ1c3R5YXBwLmNvbS8iLCJzdWIiOiJ1c2Vycy8xMzAwODE5MzgwIiwiZXhwIjoxNDg5OTgwNTI2fQ.5ZJG9GyhG-OCXg0C510MBFs9EQHdE909s4hpNxnM6LU"}' http://localhost:4567/tokens

然而,这将在我的Kotlin文件中得到一个空值,第20行

/**
 * REST API for getting tokens
 * Created by juanma on 15/3/17.
 */

import spark.Spark.get
import spark.Spark.post
import spark.Spark.*
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper

fun main(args: Array<String>) {
    get("/hello") { req, res -> "Hello World" }
    path("/tokens") {
        get("") { req, res ->
            createToken()
        }
        // TODO check this instead, so I can get the params from the body
        // https://stackoverflow.com/a/30113863/3923525
        post("") { req, res ->
            val token = req.queryParams("token")
            val verifiedToken = retrieveToken(token)
            res.type("application/json")
            jacksonObjectMapper().writeValueAsString(verifiedToken)
        }
    }
}

fun createToken(): String {
    val jwtProvider: JwtProvider = JwtProvider()
    val jwt: String = jwtProvider.createJwt()
    return jwt
}

fun retrieveToken(jwt: String): String {
    val jwtProvider: JwtProvider = JwtProvider()
    return jwtProvider.verifyJwt(jwt)
}

在URL中设置令牌似乎有效,但这不是我想要做的事情:

curl -X POST 'http://localhost:4567/tokens' -d 'token=eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vdHJ1c3R5YXBwLmNvbS8iLCJzdWIiOiJ1c2Vycy8xMzAwODE5MzgwIiwiZXhwIjoxNDg5OTgwNTI2fQ.5ZJG9GyhG-OCXg0C510MBFs9EQHdE909s4hpNxnM6LU'

我正在使用Gradle,这是我的build.gradle,以防万一:

group 'com.github.juanmougan'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.1.1'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.1"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'java'
apply plugin: 'kotlin'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:1.0.1"
    compile group: 'com.sparkjava', name: 'spark-core', version: '2.5.5'
    compile 'io.jsonwebtoken:jjwt:0.7.0'
    compile group: 'com.fasterxml.jackson.module', name: 'jackson-module-kotlin', version: '2.8.7'
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
}

我遇到this answer,它使用Spark和Java并手动解析主体。所以我尝试在一个样本,全新的Spark / Maven / Java项目中使用它,但它甚至都不会编译。在这一行

JSONObject json = JSONObject.fromObject(element);

无法导入课程JSONObject。所以我想这是一个松散的结局。

任何想法都将不胜感激。
提前致谢

1 个答案:

答案 0 :(得分:0)

JSONObject位于org.json:json,您可能想要添加该包。

如果您想使用杰克逊,请查看例如http://www.journaldev.com/2324/jackson-json-java-parser-api-example-tutorial(要实际使用杰克逊,您至少需要com.fasterxml.jackson.core:jackson-core,还需要com.fasterxml.jackson.core:jackson-databind)。