【问题标题】:Cannot Catch Body From Request无法从请求中捕获正文
【发布时间】:2020-09-20 20:50:18
【问题描述】:

我在从请求正文中捕获数据时遇到问题。我知道这可能是一个非常简单的问题,但我一直在 google 和 ktor docs 中寻找这个问题并没有找到解决方案。

fun main(args: Array<String>) {
    val server = embeddedServer(Netty, port = 8080, module = Application::mainModule)
    server.start()
}
fun Application.mainModule() {
    install(ContentNegotiation) {
        jackson {
            enable(SerializationFeature.INDENT_OUTPUT)
        }
    }
    routing {
        post("/") {
            val parameters = call.receiveParameters()
            println(parameters)
        }
    }
}

在请求中发送正文:

{
    "nick": "xxx"
}

错误:

ERROR ktor.application - Unhandled: POST - /
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `io.ktor.http.Parameters` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
 at [Source: (InputStreamReader); line: 1, column: 1]
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
    at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1589)
    at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1055)
    at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:265)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3218)
    at io.ktor.jackson.JacksonConverter.convertForReceive(JacksonConverter.kt:44)
    at io.ktor.features.ContentNegotiation$Feature$install$3.invokeSuspend(ContentNegotiation.kt:169)
    at io.ktor.features.ContentNegotiation$Feature$install$3.invoke(ContentNegotiation.kt)
    at io.ktor.util.pipeline.SuspendFunctionGun.loop(PipelineContext.kt:318)
    at io.ktor.util.pipeline.SuspendFunctionGun.proceed(PipelineContext.kt:163)

【问题讨论】:

  • 一个ticket已经存在这个问题。

标签: kotlin jackson ktor


【解决方案1】:

试试

routing {
        post("/") {
            val parameters = call.receive<String>()
            println(parameters)
        }
    }

您正在使用 call.receiveParameters,但正在传递一个 json 正文。 =p

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2016-08-01
    相关资源
    最近更新 更多