我在Spring启动应用程序中有下面列出的loggingInterceptor。每当调用REST服务时都会调用此拦截器。我看到第一个2 sysout语句被立即打印,并且在进行REST调用后打印第三个sysout语句。是否仅在调用getBody()时才进行REST调用?请问你能解释一下这是怎么回事吗?感谢。
public class LoggingInterceptor implements ClientHttpRequestInterceptor {
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
System.out.println(" Before Calling Execute in LoggingInterceptor " + new Date());
ClientHttpResponse response = execution.execute(request, body);
System.out.println(" After Calling Execute in LoggingInterceptor " + new Date());
InputStream responseStream = response.getBody();
System.out.println(" After getBody() " + new Date());
}
}
答案 0 :(得分:1)
这是我的两分钱。
这是因为ClientHttpRequestInterceptor是请求的拦截器并充当代理。现在,这意味着它应该可以处理修改请求以及根据需要发送响应。
因此,执行以下操作时:
ClientHttpResponse response = execution.execute(request,body);
响应既未提交也未触发请求,但只是缓冲以进行修改(如果有的话),从类中可以看出:
class InterceptingClientHttpRequest扩展AbstractBufferingClientHttpRequest { .. ..}
所以,当你在下面做的时候:
InputStream responseStream = response.getBody();
缓冲请求触发请求,获取响应输出流。