Java Spring:如何从ClientResponse获取原始请求?
直接从ClientResponse里获取原始请求是做不到的,因为它并没有提供公开API来暴露这个信息。
要实现你的日志需求,别用ofResponseProcessor(),改用ExchangeFilterFunction的完整重载方法——它同时接收ClientRequest和ExchangeFunction参数,这样你能直接拿到原始请求,再和后续返回的响应关联起来:
@Bean public ExchangeFilterFunction logResponse() { return (request, next) -> { // 提前保存原始请求的方法和URI HttpMethod method = request.method(); URI uri = request.url(); return next.exchange(request) .doOnEach(responseSignal -> { if (responseSignal.hasElement()) { ClientResponse response = responseSignal.get(); log.info(""" {} {} {} Response Headers: {}""", method, uri, response.statusCode(), response.headers().asHttpHeaders()); } }); }; }
这么做的逻辑很直接:ExchangeFilterFunction本来就是用来拦截完整的请求-响应链路,在发起请求前先把原始请求的信息存下来,等响应返回后再结合着输出日志就行。
如果非要纠结用ofResponseProcessor(),那只能通过ClientRequest的attributes()把请求信息提前存进去,再在响应处理环节取出来,但这种方式多了一步传递逻辑,反而不如上面的方案简洁直接。
内容的提问来源于stack exchange,提问作者Honza Zidek
相关产品推荐
相关产品推荐

