RestTemplate是Spring提供的用于访问http接口的客户端工具,它提供了多种便捷访问http服务的方法,并且,它的设计完全遵循Rest风格。在任意SpringBoot项目中,都有默认集成,不用引入任何多余的jar包。相比较传统的HttpClient、Okhttp以及java原生的URLConnection,有着极高的封装度,能够大大的提高对第三方http接口访问的编写效率。
配置RestTemplate
RestTemplate工具提供两种装配方式。一种是RestTemplate类,一种是RestTemplateBuilder,其中,Spring已默认将RestTemplateBuilder装配为了Bean,直接使用即可。
这两种创建方式,各有优劣势。针对于RestTemplate类来讲,去创建一些错误处理拦截、添加默认请求参数比较容易,针对RestTemplateBuilder来讲,去设置连接超时和读超时比较容易。
比如单用RestTemplate去配置,如果要设置RestTemplate的连接超时,需要通过ClientHttpRequestFactory接口去创建,就比较麻烦。伪代码如下:
@Bean
public RestTemplate initrRestTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(ClientHttpRequestFactory requestFactory);
// TODO 通过实现ClientHttpRequestFactory接口,或者使用Spring中其它已经实现了该接口的类,等一些列操作去设置RestTemplate的连接超时
return restTemplate;
}
有句成语叫取长补短,所以,使用两个类糅合在一起去创建,就比较nice。如下:
@Bean
public RestTemplate initRestTemplate(RestTemplateBuilder restTemplateBuilder) {
// 设置连接超时和读超时都是6000毫秒
final int TIMEOUT = 6000;
RestTemplate restTemplate = restTemplateBuilder.setConnectTimeout(Duration.ofMillis(TIMEOUT))
.setReadTimeout(Duration.ofMillis(TIMEOUT))
.build();
// TODO 接着再使用RestTemplate去配置。RestTemplate提供以下配置
// 响应异常处理。应用场景:比如访问某一个系统,它的响应状态200是正常,就可以做一个统一的非200响应码的拦截
// restTemplate.setErrorHandler(ResponseErrorHandler errorHandler);
// 设置全局的默认请求参数.使用场景:比如访问某一个系统,所有的url都需要携带token请求参数,那么就可以使用此设置
// restTemplate.setDefaultUriVariables(Map<String, ?> uriVars);
// 设置请求拦截。应用场景:比如访问某个系统,需要鉴权或者添加一些全局的请求头等信息,这里可以创建多个请求拦截,执行顺序和list中对象的顺序一致
// restTemplate.setInterceptors(List<ClientHttpRequestInterceptor> interceptors);
// 设置信息转换对象.使用场景:比如设置一些编码格式、数据类型、json/xml等的类型转换器等。
// restTemplate.setMessageConverters(List<HttpMessageConverter<?>> messageConverters);
// 创建http请求工厂.使用场景:比如前面说到的设置连接超时、访问超时等。默认使用的是org.spri