【问题标题】:Limit API response to 100 and iterate it over till the end of the Response将 API 响应限制为 100 并迭代它直到响应结束
【发布时间】:2021-07-01 01:52:54
【问题描述】:

我有一个 API 将提供超过 100 个 id 作为响应,但我需要将此响应作为正文传递给另一个 API,在该 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"
]
}

我如何在此处迭代并拆分响应。请帮我解决这个问题。 提前致谢

【问题讨论】:

    标签: java list spring-boot arraylist webclient


    【解决方案1】:

    我认为对于您的用例,最好的选择是使用窗口操作。 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();
    

    【讨论】:

    • 我想把它作为 List 而不是 Flux ,上面提到的会一样吗?
    • 是的,您只需将 doOnNext 操作更改为:.doOnNext(flux ->flux.collectList().subscribe(l -> Webclient.post().uri(anotheruri))。体(通量))
    【解决方案2】:

    Flux 有一个 buffer(int maxSize) 方法,它会从 Flux 中收集元素直到达到最大尺寸并返回一个 Flux&lt;List&gt;,然后您可以在下一个 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()
    

    另一个选项是bufferTimeout(int maxSize, Duration maxTime),如果元素需要更长的时间才能饱和,它不会停止你的管道。

    【讨论】:

    • 如果我不想要通量和使用列表,我可以使用上面提到的相同吗?
    • 对于纯 java 列表,您可以使用 Guava 库:Lists.partition(workspaces, 100),或者如果您不想使用其他库,您可以这样做:Flux.fromIterable(workspaces) .... 本质上,将您的列表包装在通量中并执行上述操作。
    • List> batches = Lists.partition(modifiedWorkspacesWithDate, 100); final List modifiedWorkspace = new ArrayList(); for (Workspace workspace : batches) { modifiedWorkspace.add(workspace.getId());} 我正在尝试这样做,但是却变成了这样 --> 类型不匹配:无法从元素类型 List 转换为 Workspace跨度>
    • 我在这里犯了什么错误?
    • 能分享一下从头到尾的代码吗?代码片段越来越难以掌握
    猜你喜欢
    • 2020-05-11
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2015-11-03
    相关资源
    最近更新 更多