如何从WebClient获取顶级JSON对象的属性的Flux

时间:2018-04-05 23:50:28

标签: spring-webflux

我需要调用一个API,其响应具有以下形式,并且它承诺在结果之前返回元数据:

{
  "metadata": {...},
  "results": [...]
}

我正在使用WebClient,我希望最终得到Flux<Result>,因此我可以处理它们而不会阻止所有内容到达。有没有办法做到这一点?

我认为我最终会像Mono<Tuple2<Metadata, Flux<Result>>>那样,所以我不会阻止等待元数据或结果

1 个答案:

答案 0 :(得分:1)

由于以下几个原因,无法做到这一点:

  • 在JSON规范
  • 无法保证结果之前获取元数据
  • API可能使用"application/json"内容类型进行响应,该内容类型不是流式传输

如果远程API实际使用"application/stream+json""text/event-stream"流式传输响应结果(并且只显示结果!),则可以使用此功能。这样每个结果都可以单独解析。

现在,您需要一次性解析您所获得的API响应。 如果响应不是那么大而不是流式传输,那么在一次传递中解析整个事情实际上更有效,并且您总是可以执行以下操作:

Mono<ResponseObject> response = //...
Flux<Result> results = result.flatMap(r -> Flux.fromIterable(r.getResults());