restTemplate拦截器ClientHttpRequestInterceptor
restTemplate提供了一个拦截器链来对请求和响应做一些定制化的操作,只需要实现ClientHttpRequestInterceptor接口中的intercept方法
如添加请求头等操作
public class RestTemplateInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
this.traceRequest((ClientHttpRequest) request, body);
ClientHttpResponse response = execution.execute(request, body);
return response;
}
private void traceRequest(ClientHttpRequest request, byte[] body) throws UnsupportedEncodingException {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes == null) {
return;
}
HttpServletRequest req = ((ServletRequestAttributes) requestAttributes).getRequest();
HttpHeaders headers = new HttpHeaders();
String globalTraceId = req.getHeader("global-trace-id");
if (globalTraceId == null) {
headers.add("global-trace-id", TraceThreadLocal.getGlobalTraceId());
} else {
headers.add("global-trace-id", globalTraceId);
}
String parentTraceId = req.getHeader("local-trace-id");
if (parentTraceId == null) {
headers.add("parent-trace-id", TraceThreadLocal.getLocalTraceId());
} else {
headers.add("parent-trace-id", parentTraceId);
}
request.getHeaders().putAll(headers);
}
}
然后配置RestTemplate的时候将拦截器添加进去
@Bean
@ConditionalOnMissingBean
public RestTemplateInterceptor restTemplateInterceptor(RestTemplate restTemplate) {
RestTemplateInterceptor restTemplateInterceptor = new RestTemplateInterceptor();
List<ClientHttpRequestInterceptor> list = new ArrayList<>(
restTemplate.getInterceptors());
list.add(restTemplateInterceptor);
restTemplate.setInterceptors(list);
return restTemplateInterceptor;
}
本文由mdnice多平台发布