登录
首页 >  文章 >  java教程

WebClient响应处理:如何根据返回类型区分逐条和一次性返回数据?

时间:2024-12-10 12:24:45 168浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《WebClient响应处理:如何根据返回类型区分逐条和一次性返回数据?》,文章讲解的知识点主要包括,如果你对文章方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

WebClient响应处理:如何根据返回类型区分逐条和一次性返回数据?

根据响应类型处理webclient响应

问题:

如何根据接口返回类型是text/event-stream则逐条返回,否则一次性全部返回?

回答:

使用webclient的toentityflux,而不要使用exchangetomono或exchangetoflux。

WebClient webClient = WebClient.create();

Mono<ResponseEntity<String>> response = webClient.get()
    .uri("http://example.com")
    .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)) {
            // SSE,逐条返回
            return Mono.just(ResponseEntity.ok()
                .headers(headers2)
                .contentType(MediaType.TEXT_EVENT_STREAM)
                .body(Flux.from(Objects.requireNonNull(responseEntity.getBody()))));
        } else {
            // 非SSE,一次性返回响应体
            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响应处理:如何根据返回类型区分逐条和一次性返回数据?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

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