restTemplate拦截器ClientHttpRequestInterceptor

123 阅读1分钟

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

zhhll.icu/2023/框架/spr…

本文由mdnice多平台发布