登录
首页 >  文章 >  java教程

WebClient如何根据接口响应类型选择逐条返回或一次性返回数据?

时间:2024-12-16 14:55:04 145浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《WebClient如何根据接口响应类型选择逐条返回或一次性返回数据?》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

WebClient如何根据接口响应类型选择逐条返回或一次性返回数据?

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

逐条返回

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

一次性全部返回

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

以下是实现代码:

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()
                )));
    });

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

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>