【问题标题】:Spring ClientHttpRequestInterceptorSpring ClientHttpRequestInterceptor
【发布时间】:2015-11-18 02:58:51
【问题描述】:

我的 Spring Boot 应用程序中有以下列出的 loggingInterceptor。每当调用 REST 服务时,都会调用此拦截器。我看到第一个 2 sysout 语句被立即打印,第 3 个 sysout 语句在 REST 调用之后被打印。是否仅在调用 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());
    }  
}

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    这是我的两分钱。

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

    因此,当执行以下操作时:

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

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

    类 InterceptingClientHttpRequest 扩展 AbstractBufferingClientHttpRequest { .. ..}

    所以,当您执行以下操作时:

    InputStream responseStream = response.getBody();

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

    【讨论】:

    • 谢谢阿什维尼!所以如果有多个拦截器,应该只有其中一个有 getBody() 调用吗?这应该在具有最高优先级的拦截器中吗?
    • 因此,如果有多个拦截器,它们将根据它们的顺序或优先级执行。此外,getBody 是由 ClientHttpResponse 扩展的 HttpInputMessage 方法,因此将它们放在不同的拦截器中不会是一个问题。只是,它们将按照特定拦截器的顺序执行。
    • 再次感谢。假设我调用 REST 服务 AuthenticationService 的场景。我有 2 个拦截器 A 和 B。A 的优先级高于 B。在这种情况下,首先调用 A,然后调用 B。根据你的解释,当 response.getBody() 被调用时,请求被触发。因此,在这种情况下,A 和 B 中的 execution.execute(request, body) 都被调用,并且请求被缓冲。那么 B 中的 response.getBody 会触发对 REST 服务的调用,而 A 中的 response.getBody 会触发对 REST 服务的另一个调用吗?
    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多