根据接口的不同响应类型,webclient可以采用不同的返回方式,既可以逐条返回,也可以一次性全部返回。
逐条返回
如果接口返回类型是text/event-stream(sse),则可以使用toentityflux方法,返回一个包含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如何根据接口响应类型选择逐条返回或一次性返回数据?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号