如何处理 Webclient 对 HttpServletResponse 的响应?

How to process Webclient response to HttpServletResponse?

我们正在将我们的代码从 RestTemplate 移动到 WebClient 以实现非阻塞调用,我们几乎完成了。但是,在将我们的代码移至 WebClient 之后,我们遇到了问题,因为当客户端调用我们的 API 时,我们的响应是空白的。虽然,我们的后端客户端有响应。

我试过了,ofResponseProcessor,但这似乎没有执行(因为方法中的日志没有被打印)

这是我的代码:

Mono<ClientResponse> clientResponse = WebClient.builder()
                .clientConnector(new ReactorClientHttpConnector(clientOptions))
                .filter(processResponse(httpResponse)) <-- passing HttpServletResponse
                .baseUrl("https://xxxxx.xxxx/")
                .build()
                .get()
                .uri("/getresult")
                .exchange();
logger.info("======Thread Completed=====");

现在,我们的 processResponse 会将响应从 ClientResponse 写入 HttpServletResponse

public ExchangeFilterFunction processResponse(HttpServletResponse resp) {
        return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
             logger.info("======Writing Response=====");
             writeResponse(clientResponse,resp); //writing response to servletresponse
             return Mono.just(clientResponse);
        });
    }

我在控制台日志中没有看到 ======Writing Response=====

我也尝试在 ClientResponse 上使用 subscribe,但在我输入 Thread.sleep.

之前我仍然得到空白响应

任何人都可以帮助我了解我在这里缺少什么吗?

====更新=====

private void writeResponse(ClientResponse clientResponse, HttpServletResponse resp){

clientResponse.bodyToMono(String.class)
   .subscribe(consumer -> {
       ....
       ....
       IOUtils.copy(new ByteArrayInputStream(consumer.getBytes()),resp.getOutputStream());
    }
   ...
  );
}

因为您使用的是非阻塞调用,所以执行 API 调用(和订阅块)的线程与主线程不同,因此主线程将继续执行其余代码和 return虽然另一个线程尚未完成,但它是响应。

所以你有两个选项让你的 API 反应所以你可以 return 直接 Mono 对象并且是 API 订阅它的客户端,或者如果你想要同步(非反应式)API 你必须调用 Mono 对象的 block 方法让主线程获得外部调用的结果