我正在使用.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模板?
答案 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);
}
}