如何从 Mono<ClientResponse> 获取正文?
Posted
技术标签:
【中文标题】如何从 Mono<ClientResponse> 获取正文?【英文标题】:How to get body from Mono<ClientResponse>? 【发布时间】:2019-11-01 20:43:36 【问题描述】:我正在尝试实现 BodyExtractor 接口,从 Mono
下面是我目前拥有的代码行
public Mono<ResponseEntity<Mono<JsonNode>>> processUnmappedApiRequest(ServerHttpRequest request, JsonNode body) RequestData reqData = this.prepareReqMetadata(request, body); Mono<ClientResponse> 响应 = commonConnector.getApiResponse(reqData); 返回 response.map(respData -> int latestVersion = respData.headers().header("version").size() == 0 ?获取最新版本(请求): Integer.parseInt(respData.headers().header("version").get(0)); 列表转换器列表; if((converterList = converterSequenceProvider.getConverterList(reqData.getRequestPath(), latestVersion, reqData.getVersion())) != null) return ResponseEntity.ok().body(respData.bodyToMono(JsonNode.class).map(respBody -> convertToDesiredVersion(converterList, respBody))); 返回 ResponseEntity.ok().body(respData.bodyToMono(JsonNode.class)); );在这种方法中,我的返回类型是 Mono>>,我正在尝试将其转换为 Mono>,因为我的团队不同意 Mono 中的 Mono。
所以这里的重点是我不想使用 bodyToMono 方法,我不知道如何使用 body 方法。
请帮帮我。
【问题讨论】:
【参考方案1】:如果您试图只返回一个Mono
对象,您可以使用flatMap
方法而不是map
,这样您就可以避免使用Mono<Mono<X>>
之类的东西而只获得Mono<X>
。
map
通过应用同步转换此 Mono 发出的项目 对它起作用。
flatMap
异步转换此 Mono 发出的项目,返回 另一个 Mono 发出的值(可能更改值类型)。
另外,ServerResponse.BodyBuilder
syncBody
上有一个方法可以获取正常的身体并在Mono
中返回它。映射函数的参数已经是一个未包装的对象,所以你可以这样做:
JsonNode jsonNode=transform(clientResponse);
return ResponseEntity.ok().syncbody(jsonNode);
【讨论】:
我很高兴它能正常工作,您能接受这个答案吗?以上是关于如何从 Mono<ClientResponse> 获取正文?的主要内容,如果未能解决你的问题,请参考以下文章
合并两个 Mono 并获得一个 Flux。然后从那个 Flux 中提取一个 Mono