【发布时间】:2018-10-06 00:21:59
【问题描述】:
我为我的自定义日志拦截器做了以下操作
public class HttpLoggingInterceptor implements ClientHttpRequestInterceptor {
private final static Logger log = LoggerFactory.getLogger(HttpLoggingInterceptor.class);
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
logRequest(request, body);
ClientHttpResponse response = execution.execute(request, body);
logResponse(response);
return response;
}
private void logRequest(HttpRequest request, byte[] body) throws IOException {
log.info("Request URI : {}, Method : {}, Headers : {}, Request body : {}", request.getURI(), request.getMethod(), request.getHeaders(), new String(body, "UTF-8"));
}
private void logResponse(ClientHttpResponse response) throws IOException {
log.info("Response Status code : {}, Status text : {}, Headers : {}, Response body: {}", response.getStatusCode(), response.getStatusText(), response.getHeaders(), StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
}
}
我将拦截器设置为 restTemplate
@Autowired
public RestTemplate restTemplate;
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
List<ClientHttpRequestInterceptor> clientHttpRequestInterceptors = new ArrayList<>();
clientHttpRequestInterceptors.add(new HttpLoggingInterceptor());
// clientHttpRequestInterceptors.addAll(restTemplate.getInterceptors());
restTemplate.setInterceptors(clientHttpRequestInterceptors);
// restTemplate.setInterceptors(Collections.singletonList(new HttpLoggingInterceptor()));
}
记录器正在将响应正确地打印到控制台,但最后响应以空的形式返回给调用者。我无法调试并弄清楚。
我发现StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()) 正在读取输入流一次,它不再在其中保存响应主体(现在是空的)
其他人也面临同样的问题,并且有任何想法复制 InputStream 而不从原始 InputStream 中读取它?
【问题讨论】:
-
InputStream只能使用一次。因此,除了将 InputStream 数据存储到中间变量并从该数据创建新 InputStream 之外没有其他解决方法(实际上是“复制”) -
是的,你是对的,只有使用 ew RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory())) 才能多次读取 HttpInputStream 我已经在下面发布了答案
标签: spring interceptor resttemplate