从ClientHttpRequestInterceptor检索RestTemplate调用中使用的URI模板

时间:2018-03-09 01:00:21

标签: spring spring-boot resttemplate

我正在使用.subs(x, y + p)使用RestTemplate调用外部资源,其中URI为https://external.com/resource/ {resourceID}。

因此,我的GET来电如下:

RestTemplate

其中restTemplate.getForObject("https://external.com/resource/{resourceID}", String.class, uriMapObject)是包含ID变量的地图。

我还为uriMapObject设置了ClientHttpRequestInterceptor,其中拦截器的功能是为该调用创建一个日志项,并将其发送给ElasticSearch进行日志记录。

RestTemplate

问题是在 @Override public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] body, ClientHttpRequestExecution execution) throws IOException { Map<String, Object> reqHeaders = new HashMap<>(); try{ // getPath() already contains the URI variable String uri = httpRequest.getURI().getPath(); } catch (IllegalStateException e){ log.warn(e.getMessage()); } ..... return response; } 方法中,我无法访问用于派生要调用的实际URL的原始URI模板。我只能从ClientHttpRequestInterceptor对象中访问已经有唯一标识符的实际URL,这反过来又无法将所有对https://external.com/resource/ {resourceID}的调用聚合为Elastic中的单个模式。 / p>

有哪些方法可以从拦截器中获取URI模板?

1 个答案:

答案 0 :(得分:0)

URI模板扩展由RestTemplate&#39; UriTemplateHandler指定。您可以通过调用RestTemplate#setUriTemplateHandler来自定义此行为,并指定您自己的实现。

我建议为UriTemplateHandler创建一个委托对象,并在RestTemplate上包装默认设置的内容。

class LoggingUriTemplateHandler implements UriTemplateHandler {
    private UriTemplateHandler delegate;

    LoggingUriTemplateHandler(final UriTemplateHandler delegate) {
        this.delegate = delegate;
    }

    public URI expand(final String template, final Map<String, ?> vars) {
        //log template here
        return this.delegate.expand(template, vars);
    }

    public URI expand(final String template, final Object... vars) {
        //log template here
        return this.delegate.expand(template, vars);
    }
}