使用 Ktor 发送发布请求时出现内部服务器错误

Posted

技术标签:

【中文标题】使用 Ktor 发送发布请求时出现内部服务器错误【英文标题】:Internal server error while sending a post request with Ktor 【发布时间】:2021-12-19 16:09:41 【问题描述】:

我正在尝试制作一个允许我查询所有元素的简单 API。它列出了客户和订单的所有数据。

我有针对客户和订单的 GET、POST、DELETE 路线。这些订单和客户是数据类。现在,当我尝试发送发布请求时,它会给出 500 INTERNAL SERVER ERROR 并给出此错误

kotlinx.serialization.SerializationException:找不到类“客户”的序列化程序。`

但我已经用@Serializable 注释了我的Customer 类。

我的 GET 请求正常工作。

客户数据类

data class Customer(
    val id : String,
    val firstName : String,
    val lastName : String,
    val email : String,
)
val customerStorage = mutableListOf<Customer>()

订单数据类

data class Order(
    val number: String, //Because it will contain a number with dashes
    val contents : List<OrderItem>,
)

@Serializable
data class OrderItem(
    val item : String,
    val amount : Int, //what is the amount of each item in each order
    val price : Double,
)

//place to store our orders
val orderStorage = listOf(Order(
    "2020-04-06-01", listOf(
        OrderItem("Ham Sandwich",2,5.50),
        OrderItem("Water",1,1.50),
        OrderItem("Beer",3,2.30),
        OrderItem("Cheesecake", 1,3.75)
    )

),
    Order("2020-04-03-01", listOf(
        OrderItem("Cheeseburger",1,8.50),
        OrderItem("Water", 2,1.50),
        OrderItem("Coke",2,1.76),
        OrderItem("Ice Cream", 1,2.35)
    ))
)

客户的发布路线

post
    val customer = call.receive<Customer>()
    customerStorage.add(customer) 
    call.respondText("Customer stored correctly", status = HttpStatusCode.Created)

我指的是this tutorial

【问题讨论】:

请检查您是否添加了kotlinx.serialization Gradle 插件github.com/Kotlin/kotlinx.serialization#using-the-plugins-block 并使用适当的转换器ktor.io/docs/kotlin-serialization.html#register_converter 安装了ContentNegotiation 插件。 感谢Aleksei Tirman 回复此问题。我已经检查过了,我已经添加了kotlinx.serialization Gradle 插件,因为我需要的转换器仅适用于 JSON,所以我已经安装了带有 JSON 转换器的ContentNegotiation 由于我无法重现您的问题,能否请您分享您的项目? 【参考方案1】:

我还指的是您提到的教程。我遇到了同样的错误。我将 ktor_version=1.6.5 更改为 ktor_version=1.6.1 并运行了该项目。效果很好。

我认为 kotr 版本 1.6.5 存在一些问题。

另外,不要忘记在 build.gradle.kts 文件中添加kotlin("plugin.serialization") version "1.6.0"。它应该是这样的:

plugins 
application
kotlin("jvm") version "1.6.0"
kotlin("plugin.serialization") version "1.6.0" 

【讨论】:

以上是关于使用 Ktor 发送发布请求时出现内部服务器错误的主要内容,如果未能解决你的问题,请参考以下文章

向本地服务器发送请求时出现 Flutter Web XMLHttpRequest 错误

在 wcf rest 中发送 xml 请求时出现错误请求 400

在 Heroku 上部署 ktor 应用程序时出现 JDBC_DATABASE_URL 错误

[尝试发送其他语言的PUT请求时出现服务器错误

使用 HttpWebRequest 通过 SSL 发送请求时出现错误 502(错误网关)

发出发布请求时出现NodeJS CORS错误