根据接口的不同响应类型,webclient可以采用不同的返回方式,既可以逐条返回,也可以一次性全部返回。

逐条返回

如果接口返回类型是text/event-stream(sse),则可以使用toentityflux方法,返回一个包含flux 作为响应体的mono >>。此flux会逐条发出响应体中的数据。

一次性全部返回

如果接口返回类型不是text/event-stream,则使用toentityflux方法返回一个包含完整响应体(字符串)的mono >。

以下是实现代码:

return requestSpec
    .retrieve()
    .onStatus(HttpStatusCode::isError, clientResponse -> clientResponse.createException().flatMap(Mono::error))
    .toEntityFlux(String.class)
    .flatMap(responseEntity -> {
        HttpHeaders headers2 = responseEntity.getHeaders();
        MediaType contentType2 = headers2.getContentType();
        if (MediaType.TEXT_EVENT_STREAM.isCompatibleWith(contentType2)) {
            return Mono.just(ResponseEntity.ok()
                    .headers(headers2)
                    .contentType(MediaType.TEXT_EVENT_STREAM)
                    .body(Flux.from(Objects.requireNonNull(responseEntity.getBody()))));
        } else {
            return Objects.requireNonNull(responseEntity.getBody()).reduce("", String::concat)
                    .map(body2 -> ResponseEntity.ok()
                            .headers(headers2)
                            .body(body2));
        }
    })
    .onErrorResume(WebClientResponseException.class, e -> {
        return Mono.just(ResponseEntity.status(e.getStatusCode())
                .headers(e.getHeaders())
                .body(e.getResponseBodyAsString()));
    })
    .onErrorResume(e -> {
        HttpHeaders errorHeaders = new HttpHeaders();
        errorHeaders.set("error-status", "500");
        errorHeaders.set("error-message", e.getMessage());
        return Mono.just(ResponseEntity.status(500)
                .headers(errorHeaders)
                .body(Map.of(
                        "status", "500",
                        "error", "Internal Server Error",
                        "message", e.getMessage()
                )));
    });
登录后复制

这种实现的方式的优势在于,它根据响应类型的不同,可以灵活地选择是逐条返回还是一次性返回。

以上就是WebClient如何根据接口响应类型选择逐条返回或一次性返回数据?的详细内容,更多请关注慧达安全导航其它相关文章!

点赞(0)

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部