当我尝试使用 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.receivekotlinx/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 库不执行任何操作