问题描述
我有一个 API,它将提供超过 100 个 id 作为响应,但我需要将此响应作为主体传递给另一个 API,在那里它只需要 100 个 id 作为请求主体,我需要拆分这些响应并发送将其分批发送到另一个 API,任何人都可以帮我将这些响应拆分为 100 个并将其发送给另一个。
服务类-
Workspaces workspace = new Workspaces(mw);
Flux<Workspaces> modifiedWorkspace = webClient.post().uri(URIDetails.MODIFIEDWORKSPACE)
.header("Authorization",bearerToken).body(Mono.just(mw),Workspaces.class).retrieve()
.bodyToFlux(Workspaces.class);
modifiedWorkspace.doOnNext(System.out::println).blockLast();
return null;
工作区模型-
public class Workspaces {
private List<String> workspaces;
}
主调用-
Flux<ScanIDModel> modifiedWorkspaces;
final List<String> mw = new ArrayList<>();
for (Workspace w : modifiedWorkspaces) {
mw.add(w.getId());
}
modifiedWorkspaces = scanRespone(mw);
JSON 正文:
{
"workspaces": [
"6eret123","b129078v","ngy66553","erfc1153"
]
}
我如何迭代它并在此处拆分响应。请帮我解决这个问题。 提前致谢
解决方法
我认为对于您的用例,最好的选择是使用窗口操作。 https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#window-java.time.Duration- 此运算符将每 n 个项目打开一个新通量,在您的情况下每 100 个项目打开一个新通量,然后您可以将此新通量发送到另一个 API。 此代码的一个示例是:
modifiedWorkspace
.window(100)
.doOnNext(flux -> Webclient.post().uri(anotheruri).body(flux))
.subscribe();
,
Flux 有一个方法 https://cogitas.net/creating-flavors-of-a-flutter-app/,它会从 Flux 收集元素直到最大大小并返回一个 Flux<List>
,然后您可以在下一个 API 中使用它。例如
Flux.just(1,2,3,4,5,6)
.buffer(2)
.flatMap(list -> /* List of 2 elements each*/ webClient.post().uri(uri).body(list).retrieve())
.subscribe()
另一个选项是 buffer(int maxSize)
,如果元素需要更长时间才能饱和,它不会停止您的管道。