Ктор с весенней загрузкой WebFlux Web API - PullRequest
0 голосов
/ 18 января 2020

У меня есть простой 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 для получения данные, но я не уверен, что делать. Чтение документов выглядит так: Потоковая передача по области - это то, что мне нужно, но я не уверен, как заставить его работать с моим контроллером

Вот код клиента, который у меня есть.

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: преобразование не найдено: class io.ktor.utils.io.ByteBufferChannel ( Kotlin отражение недоступно)

Похоже, я не могу просто сериализовать поток в свой объект, так как мне сериализовать ByteReadChannel в объект?

Это моя первая попытка весны и ктор

1 Ответ

0 голосов
/ 22 января 2020

Чтобы иметь возможность сериализации данных в объект, вы должны сделать это вручную, считав данные в байтовый массив

 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))
    }
...