Spring ClientHttpRequestInterceptor

时间:2015-11-18 02:58:51

标签: java spring spring-boot

我在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());
    }  
}

1 个答案:

答案 0 :(得分:1)

这是我的两分钱。

这是因为ClientHttpRequestInterceptor是请求的拦截器并充当代理。现在,这意味着它应该可以处理修改请求以及根据需要发送响应。

因此,执行以下操作时:

ClientHttpResponse response = execution.execute(request,body);

响应既未提交也未触发请求,但只是缓冲以进行修改(如果有的话),从类中可以看出:

class InterceptingClientHttpRequest扩展AbstractBufferingClientHttpRequest { .. ..}

所以,当你在下面做的时候:

InputStream responseStream = response.getBody();

缓冲请求触发请求,获取响应输出流。