如何处理 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 方法让主线程获得外部调用的结果
我们正在将我们的代码从 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 方法让主线程获得外部调用的结果