使用RestTemplate调用第三方服务时,可能需要设置公共的参数,例如签名信息。所以需要在拦截器中统一的处理。而RestTemplate提供了ClientHttpRequestInterceptor。便于我们拦截处理。
1. 设置
@Configuration
public class XxRestTemplateConfig {
@Bean(name = "xxRestTemplate")
public RestTemplate xxRestTemplate(XxConfigProperties xxConfigProperties) {
RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(
new SimpleClientHttpRequestFactory()
));
//设置消息处理器
for (HttpMessageConverter<?> converter : restTemplate.getMessageConverters()) {
if (converter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
}
}
//设置拦截器
restTemplate.setInterceptors(Collections.singletonList(xxRestAuthInterceptor(xxConfigProperties)));
return restTemplate;
}
@Bean
public XxRestAuthInterceptor xxRestAuthInterceptor(XxConfigProperties xxConfigProperties) {
return new XxRestAuthInterceptor(xxConfigProperties);
}
}
创建ClientHttpRequestInterceptor实现类:
@Slf4j
public class XxRestAuthInterceptor implements ClientHttpRequestInterceptor {
//自定义的配置文件
private XxConfigProperties xxConfigProperties;
public WPSRestAuthInterceptor(XxConfigProperties xxConfigProperties) {
this.xxConfigProperties = xxConfigProperties;
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
HttpMethod method = request.getMethod();
//修改请求的header对象
request.getHeaders().set("sign", sign);
//执行请求
ClientHttpResponse response = execution.execute(request, body);
return response;
}
}
2. 使用
@Autowired
@Qualifier("xxRestTemplate")
private RestTemplate wpsRestTemplate;