【问题标题】:Retrieving the name of the method from which HTTP call was made using an Interceptor检索使用拦截器进行 HTTP 调用的方法的名称
【发布时间】:2020-10-06 06:16:25
【问题描述】:

我正在使用 Spring ClientHttpRequestInterceptor 捕获来自我的应用程序的所有传出 HTTP 调用,以便记录数据。除了我已经在拦截器中收集的数据之外,我还想以某种方式获取发起 HTTP 调用的函数的名称。因此,例如,如果一个名为 getStuffFromUrl 的方法正在使用 Spring RestTemplate 进行 HTTP 调用,如下所示,

public String getStuffFromUrl() {
    ...
    return restTemplate.exchange(url, HttpMethod.GET,entity, String.class).getBody();
}

当我在拦截器中捕获此出站 HTTP 调用时,我还想检索方法名称 getStuffFromUrl。我该怎么做呢?

【问题讨论】:

    标签: java spring spring-boot elastic-stack graylog2


    【解决方案1】:

    如果允许您修改 HTTP 请求,一种方法是为方法名称添加临时 HTTP 标头:

    public String getStuffFromUrl() {
        HttpHeaders headers = new HttpHeaders();
        headers.add("JavaMethod", "getStuffFromUrl");
        entity = new Entity(headers)
        ...
        return restTemplate.exchange(url, HttpMethod.GET,entity, String.class).getBody();
    }
    

    然后,您可以取回方法名称并在实际发送 HTTP 请求之前从 ClientHttpRequestInterceptor 中删除标头。

    ClientHttpResponse intercept(HttpRequest request, byte[] body,
                             ClientHttpRequestExecution execution)
                      throws IOException {
    
        String javaMethodName="Unknown";
    
        List<String> javaMethodHeader = request.getHeaders().remove("JavaMethod");
        if(javaMethodHeader!=null && javaMethodHeader.size()>0) {
            javaMethodName = javaMethodHeader.get(0);
        }
    
        log.info("Calling method = "+ javaMethodName);
        execution.execute(request, body);
    }
    

    (提供的代码未经测试)

    【讨论】:

    • 感谢您的建议。如果 HTTP 请求的修改是可行的,这将是一个很好的解决方案。就我而言,它不是,所以我通过将数据存储在 Request-Scoped-Bean (baeldung.com/spring-bean-scopes) 中找到了替代解决方案。或者,您也可以将此信息存储在 ThreadLocal 变量中并在拦截器中重置它
    猜你喜欢
    • 2012-08-18
    • 2018-07-08
    • 2020-11-08
    • 2015-08-14
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    相关资源
    最近更新 更多