使用 Spring 启动 WebFlux web api 的 Ktor
Ktor with Spring boot WebFlux web api
我有一个简单的 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)
}
}
它只是returns一个每秒有一个数字的对象
现在我想在客户端使用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: No transformation found: class
io.ktor.utils.io.ByteBufferChannel (Kotlin reflection is not
available)
看来我不能将流序列化到我的对象中,那么如何将 ByteReadChannel
序列化到一个对象中呢?
这是我第一次尝试 spring 和 ktor
为了能够将数据序列化为对象,您需要通过将数据读入字节数组来手动完成
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))
}
您可以为 JSON serialization/deserialization 安装插件,这将允许您使用数据 类 作为通用参数
我有一个简单的 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)
}
}
它只是returns一个每秒有一个数字的对象
现在我想在客户端使用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: No transformation found: class io.ktor.utils.io.ByteBufferChannel (Kotlin reflection is not available)
看来我不能将流序列化到我的对象中,那么如何将 ByteReadChannel
序列化到一个对象中呢?
这是我第一次尝试 spring 和 ktor
为了能够将数据序列化为对象,您需要通过将数据读入字节数组来手动完成
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))
}
您可以为 JSON serialization/deserialization 安装插件,这将允许您使用数据 类 作为通用参数