项目实战中,不可避免的会调用第三方接口,调用同一个厂商的第三方接口时会有着相同的逻辑,例如延签逻辑、设置header逻辑,我们可以定制化实现RestTemplate的bean。将公共逻辑进行解耦。
1. 自定义RestTemplate
为每一个厂商均实现单独的RestTemplate的bean,完成定制化操作。
@Configuration
public class MyRestTemplateConfig {
@Bean(name = "myRestTemplate")
public RestTemplate wpsRestTemplate(WPSConfigProperties wpsConfigProperties) {
//定制化可重复读的响应对象的装饰器类。
//可替换为OkHttp。
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(1000);
factory.setReadTimeout(3000);
RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(factory));
//处理消息转换器
for (HttpMessageConverter<?> converter : restTemplate.getMessageConverters()) {
if (converter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
}
}
//设置拦截器。处理公共逻辑
restTemplate.setInterceptors(Arrays.asList(
myRestAuthInterceptor(myConfigProperties),
restTemplateMetricsInterceptor()));
return restTemplate;
}
//验签的拦截器
@Bean
public MyRestAuthInterceptor myRestAuthInterceptor(MyConfigProperties myConfigProperties) {
return new MyRestAuthInterceptor(myConfigProperties);
}
//监控的拦截器
@Bean
public RestTemplateMetricsInterceptor restTemplateMetricsInterceptor() {
return new RestTemplateMetricsInterceptor();
}
}
2. 实现定制化的拦截器
在定制化的拦截器中完成某一个厂商的所有第三方接口的定制化操作。包含日志操作或者延签操作等等。
@Slf4j
public class MyRestAuthInterceptor implements ClientHttpRequestInterceptor {
private MyConfigProperties myConfigProperties;
public MyRestAuthInterceptor(MyConfigProperties myConfigProperties) {
this.myConfigProperties = myConfigProperties;
}
/**
* techhub-auth 新增该body,存放wps下发的appId
*/
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
//延签逻辑
long startTime = System.currentTimeMillis();
ClientHttpResponse response = execution.execute(request, body);
try {
//读取流为String
String responseBody = StreamUtils.copyToString(response.getBody(), Charset.defaultCharset());
//打印日志
loggerInfo(request, body, startTime, responseBody);
} catch (Exception e) {
//不打印异常
log.error("", e);
}
return response;
}
/**
* 收集日志信息
*
* @param request 请求对象
* @param body 请求体
* @param startTime 请求发送事件
* @param responseBody 响应对象
*/
private void loggerInfo(HttpRequest request, byte[] body, long startTime, String responseBody) {
SealLogger.log("my request is uri:{},body:{},executeTime:{}ms\n" +
"my response :{}",
request.getURI(), new String(body), System.currentTimeMillis() - startTime, responseBody);
}
}
网友评论