美文网首页
SpringBoot2.x下更加灵活的RestTemplate(

SpringBoot2.x下更加灵活的RestTemplate(

作者: 小胖学编程 | 来源:发表于2021-06-10 10:18 被阅读0次

项目实战中,不可避免的会调用第三方接口,调用同一个厂商的第三方接口时会有着相同的逻辑,例如延签逻辑、设置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);
    }

}

相关文章

网友评论

      本文标题:SpringBoot2.x下更加灵活的RestTemplate(

      本文链接:https://www.haomeiwen.com/subject/lgrueltx.html