如何从 Mono<ClientResponse> 获取正文?

Posted

技术标签:

【中文标题】如何从 Mono<ClientResponse> 获取正文?【英文标题】:How to get body from Mono<ClientResponse>? 【发布时间】:2019-11-01 20:43:36 【问题描述】:

我正在尝试实现 BodyExtractor 接口,从 Mono 获取正文作为对象,而不是在 Mono 中。 我找不到 BodyExtractor 实现的任何示例。我想知道这是实现它的好主意,还是有任何其他方法可以将主体作为对象。

下面是我目前拥有的代码行

public Mono&ltResponseEntity&ltMono&ltJsonNode&gt&gt&gt processUnmappedApiRequest(ServerHttpRequest request, JsonNode body) RequestData reqData = this.prepareReqMetadata(request, body); Mono&ltClientResponse&gt 响应 = 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&lt;Mono&lt;X&gt;&gt; 之类的东西而只获得Mono&lt;X&gt;

map

通过应用同步转换此 Mono 发出的项目 对它起作用。

flatMap

异步转换此 Mono 发出的项目,返回 另一个 Mono 发出的值(可能更改值类型)。

另外,ServerResponse.BodyBuildersyncBody 上有一个方法可以获取正常的身体并在Mono 中返回它。映射函数的参数已经是一个未包装的对象,所以你可以这样做:

JsonNode jsonNode=transform(clientResponse);
return ResponseEntity.ok().syncbody(jsonNode);

【讨论】:

我很高兴它能正常工作,您能接受这个答案吗?

以上是关于如何从 Mono<ClientResponse> 获取正文?的主要内容,如果未能解决你的问题,请参考以下文章

如何从Mono获取实体类型 ?

如何从 Spring Flux 平面图操作中返回对象

合并两个 Mono 并获得一个 Flux。然后从那个 Flux 中提取一个 Mono

无法从 Flux<PortCall> 转换为 Mono<?扩展对象>

如何以响应式方式通过 Mono 返回应用程序/pdf

如何返回 Mono<ServerResponse>