我有一个 Web 服务,我正在尝试使用新的 Spring 5 WebClient 来使用它。
工作示例
# GET /orders/
[
{ orderId: 1, ... },
{ orderId: 1, ... }
]
以及调用的java代码
// Java
Flux<Order> ordersStream = webClient.get()
.uri("/orders/")
.exchange()
.flatMap(response -> response.bodyToFlux(Order.class));
问题
来自 Web 服务的响应是分页的,因此不像上面的示例那样直接包含项目列表。
看起来像这样
# GET /orders/
{
"error": null,
"metadata": {
"total": 998,
"limit": 1000,
"offset": 0
},
"data": [
{ orderId: 1, ... },
{ orderId: 2, ... },
]
}
我怎样才能得到子键"data"
作为一个Flux<Order>
?
可能的解决方案,但我不知道这是否是最好的方法......
创建一个包装器类并将包装器转换.data
为通量。
但是现在我们需要立即反序列化整个响应,可能会耗尽内存。
// Java
Flux<Order> ordersStream = webClient.get()
.uri("/orders/")
.exchange()
.flatMap(response -> response.bodyToMono(PageWrapper.class))
.flatMapMany(wrapper -> Flux.fromIterable(wrapper.data));
有没有更好的办法?