Ktor 与 Spring Boot WebFlux web api
Posted
技术标签:
【中文标题】Ktor 与 Spring Boot WebFlux web api【英文标题】:Ktor with Spring boot WebFlux web api 【发布时间】:2020-05-04 19:48:12 【问题描述】:我有一个简单的Spring Boot WebFlux
api,我正在尝试使用Ktor
来调用它。
这是我的控制器
@RestController
@RequestMapping("api/v1")
class TestController
@RequestMapping(method = [RequestMethod.GET], value = ["/values"], produces = [MediaType.TEXT_EVENT_STREAM_VALUE])
fun sayHello(@RequestParam(value = "name") name:String): Flux<Example>
return Flux.interval(Duration.ofSeconds(1))
.map Example(number = generateNumber())
.share()
fun generateNumber(): Int
return ThreadLocalRandom.current().nextInt(100)
它只是每秒返回一个带有数字的对象
现在在客户端是我想使用 Ktor 获取数据的地方,但我不确定该怎么做。阅读文档,看起来 Scoped streaming 是我需要的,但我不确定如何让它与我的控制器一起使用
这是我目前的客户端代码。
suspend fun getData(): Flow<Example>
return flow
val client = HttpClient()
client.get<HttpStatement>("http://192.168.7.24:8080/api/v1/values?name=hello").execute
val example = it.receive<Example>()
emit(example)
当我尝试在 android
客户端上拨打电话时出现此错误
NoTransformationFoundException:未找到转换:类 io.ktor.utils.io.ByteBufferChannel(Kotlin 反射不是 可用)
所以看起来我不能只将流序列化到我的对象中,那么如何将ByteReadChannel
序列化为对象?
这是我第一次尝试spring和ktor
【问题讨论】:
【参考方案1】:为了能够将数据序列化为对象,您需要手动将数据读入字节数组
client.get<HttpStatement>("http://192.168.7.24:8080/api/v1/values?name=hello").execute
val channel = it.receive<ByteReadChannel>()
val byteArray = ByteArray(it.content.availableForRead)
channel.readAvailable(byteArray,0,byteArray.size)
val example:Example = Json.parse<Example>(stringFromUtf8Bytes(byteArray))
【讨论】:
【参考方案2】:您可以安装一个用于 JSON 序列化/反序列化的插件,这将允许您使用数据类作为通用参数
https://ktor.io/docs/json.html#jackson
【讨论】:
以上是关于Ktor 与 Spring Boot WebFlux web api的主要内容,如果未能解决你的问题,请参考以下文章
用于 Spring Boot(和其他 Web 框架)的 Java 或 Kotlin [关闭]
未生成 Spring ReactiveMongoRepository bean
Ktor Websocket 功能与 ktor 中的 ContentNeogation 功能 (JSON / GSON)