是否可以使用 Java Stream api 重写带有 Rest-Assured 请求尝试的 WHILE 循环

Posted

技术标签:

【中文标题】是否可以使用 Java Stream api 重写带有 Rest-Assured 请求尝试的 WHILE 循环【英文标题】:Is it possible to rewrite WHILE loop with Rest-Assured requests attempts using Java Stream api 【发布时间】:2021-12-28 04:58:49 【问题描述】:

我有一个通过 Rest-assured 发送请求的方法,如果响应不满足条件(响应状态码为 200),它会多次尝试,除非我得到 200 作为响应状态码

protected Response getResponseWithRetries(Map<String, Object> requestBody, String token, String url) 
    Response response = null;
    int statusCode = HttpStatus.SC_BAD_GATEWAY;
    int count = 0;
    while (statusCode != HttpStatus.SC_OK && count < 3) 
        response = getResponse(requestBody, token, url);
        statusCode = response.getStatusCode();
        count++;
        sleep(5000);
    
    return response;

但是可以用 Stream api 重写这个循环吗?如果我可以在我的情况下应用它,我正在努力理解。首先,我没有要流式传输的响应集合。但我也不想提出几个请求来构建它(例如,当它们都成功时)

【问题讨论】:

【参考方案1】:

您可以使用IntStream.range 替换条件中的count 部分,然后过滤http 状态代码的响应,并使用findFirst 返回第一个匹配项。

Optional<Response> response = IntStream.range(0, 3)
    .mapToObj(i -> getResponse(requestBody, token, url))
    .filter(r -> r.getStatusCode() == HttpStatus.SC_OK)
    .findFirst();
return response.orElse(null);

如果您可能返回 null 而不是响应,则将返回类型更改为 Optional&lt;Response&gt; 是有意义的。


如果您想在失败的情况下获得最后一个响应,您可以进行 2 次迭代,然后在 2 次迭代中没有返回肯定状态代码时使用 Optional.orElseGet 进行最后一次 getResponse 调用。

Optional<Response> response = IntStream.range(0, 2)
    .mapToObj(i -> getResponse(requestBody, token, url))
    .filter(r -> r.getStatusCode() == HttpStatus.SC_OK)
    .findFirst();
return response.orElseGet(() -> getResponse(requestBody, token, url));

【讨论】:

谢谢,这看起来像是我需要的东西,我需要的唯一更改是在所有尝试都失败时采取最后的响应。 我已经编辑了答案,以举例说明如何始终返回最后一次尝试。

以上是关于是否可以使用 Java Stream api 重写带有 Rest-Assured 请求尝试的 WHILE 循环的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 YouTube Live Stream API 通过我的手机摄像头进行广播?

Java8中Stream类中的forEach是抽象方法,为啥在调用的时候不用重写该方法就能实现遍历?

java8--- Stream API

java 异常问题:是否每种Exception问题都可以在API中找到,我有些没在API中找到

Java 8 Stream API实例

使用Java8 Stream API对Map按键或值进行排序