当我尝试使用 ktor 和 moshi 在服务器端解码 json 时,我得到“kotlinx/coroutines/io/ByteReadChannel”

Posted

技术标签:

【中文标题】当我尝试使用 ktor 和 moshi 在服务器端解码 json 时,我得到“kotlinx/coroutines/io/ByteReadChannel”【英文标题】:I get "kotlinx/coroutines/io/ByteReadChannel" when I try to decode a json on server side with ktor and moshi 【发布时间】:2021-01-20 07:13:50 【问题描述】:

在 Application.kt 中,我在 Application.module 中安装 moshi

   install(ContentNegotiation)
        moshi()
    

我声明了一个简单的测试类,并在路径中尝试解码测试类:

data class Test(val testString: String)

fun Route.test() 
    post (TEST_ENDPOINT) 
        val testReceive = call.receive<Test>()
        call.respond(testReceive)
    

请求带有以下标头和正文:

Accept: */*
Accept-Encoding: gzip, deflate
Content-Type: application/json
Accept-Language: en-gb


  "testString": "dasdada"

响应标头:

HTTP/1.1 500 Internal Server Error

Date: Mon, 05 Oct 2020 11:55:58 GMT
Content-Length: 37
Connection: keep-alive
Content-Type: text/plain; charset=UTF-8
Server: ktor-server-core/1.4.1 ktor-server-core/1.4.1

响应正文:

kotlinx/coroutines/io/ByteReadChannel

欢迎提出任何建议或意见。

【问题讨论】:

问题似乎出在服务器端,因为服务器以500 错误代码响应。您可能不会打印响应正文,而只是打印类的调试表示(例如toString())。因此它打印出的是类型,而不是内容。 @KenVanHoeylandt,好的,我明白了,但即使我用这样的硬编码字符串响应 call.respond("test"),我也会得到同样的错误。我相信问题出在 val testReceive = call.receive() 但我不明白问题出在哪里。 响应失败,因为后端一直失败。问题出在后端。关于kotlinx/coroutines/io/ByteReadChannel 的响应:那只是您在代码中错误地读取了响应。您可以使用copyTo()copyAndClose() 将其转换为流,然后再转换为字符串。 代码在后端运行,它接收来自其他客户端的请求。我搬到了 gson,它似乎工作。我会发布一个答案。 【参考方案1】:

Moshi 1.0.1 依赖于一些过时的 Ktor API。 考虑回到 Ktor 1.3.2 或(更好)使用另一个 JSON 处理程序(有几个可用的开箱即用:Gson、Jackson 和 kotlinx.serialization)

【讨论】:

以上是关于当我尝试使用 ktor 和 moshi 在服务器端解码 json 时,我得到“kotlinx/coroutines/io/ByteReadChannel”的主要内容,如果未能解决你的问题,请参考以下文章

尝试在客户端接收数据时,Ktor-websocket 库不执行任何操作

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

当我创建 Moshi 数据类时,任务 ':app:kaptDebugKotlin' 执行失败

Ktor + React 项目配置

如何在 Ktor websockets 上发送 ping

SerializedName 注释似乎在 Moshi 中不起作用