使用拦截器检索从中进行 HTTP 调用的方法的名称

Retrieving the name of the method from which HTTP call was made using an Interceptor

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

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

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

如果允许您修改 HTTP 请求,一种方法是为方法名称添加 ad-hoc HTTP header:

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 中删除 header。

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);
}

(提供的代码未经测试)