【发布时间】:2019-11-17 21:29:05
【问题描述】:
我正在尝试重构这段代码:
fun getCharacterFilms(serverRequest: ServerRequest): Mono<ServerResponse> {
val films = starWarsApiWebClient.findCharacter(serverRequest.pathVariable("id").toInt())
.flatMapMany { it.films.toFlux() }
.flatMap(starWarsApiWebClient::findFilm)
return ok().body(films, Film::class.java)
}
地点:
fun findCharacter(id: Int): Mono<Character> {...}
fun findFilm(uri: URI): Mono<Film> {...}
但现在有了 Flow:
fun findCharacter(id: Int) = webClient.baseUrl("https://swapi.co/api/").build()
.get().uri("/people/$id/")
.header("Content-Type", MediaType.APPLICATION_JSON_VALUE)
.accept(MediaType.APPLICATION_JSON).retrieve()
.bodyToFlow<Character>()
fun findFilm(uri: URI): Flow<Film> {
val webClient = WebClient.builder()
return webClient.build()
.get().uri(uri)
.header("Content-Type", MediaType.APPLICATION_JSON_VALUE)
.accept(MediaType.APPLICATION_JSON).retrieve()
.bodyToFlow<Film>()
}
没有问题:
suspend fun getCharacter(serverRequest: ServerRequest) = ok().bodyAndAwait(starWarsApiWebClient.findCharacter(serverRequest.pathVariable("id").toInt()))
但我不知道如何翻译这些 flatMapMany 和 flatMap。
提前致谢。
【问题讨论】:
标签: spring-webflux kotlin-coroutines