什么是RestTemplate
spring 中提供了用于访问http服务的客户端 RestTemplate,用来代替Apache HttpClient,使用方式简单直接,
可以使用 HttpMessageConverter 转换JSON数据,默认依赖jdk的HTTP连接工具,也可以使用Apache HttpComponents、Netty和OkHttp。
方法
- getForObject
- getForEntity
- headForHeaders
- postForLocation
- postForObject
- postForEntity
- put
- delete
- patchForObject
- optionsForAllow
- exchange
- execute
配置 RestTemplateConfig
可以使用默认构造方法new一个实例,假如默认配置不满足条件,就需要自己设置config
/**
* restTemplate 的工厂类
*
* @author plsy
*/
@Configuration
public class RestTemplateConfig {
@Bean
@ConditionalOnMissingBean({RestOperations.class, RestTemplate.class})
public RestTemplate restTemplate() {
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setReadTimeout(5000);
requestFactory.setConnectTimeout(5000);
RestTemplate restTemplate = new RestTemplate(requestFactory);
// 使用 utf-8 编码集的
restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
//设置基础验证拦截器
restTemplate.setInterceptors(Collections.singletonList(new AuthorizationInterceptor()));
return restTemplate;
}
}
指定转换器 HttpMessageConverter
一般通过reseful接口传递的数据内容都是json串,而通过RestTemplate的getForObject方法却可以直接获取JavaBean,这里就是因为RestTemplate通过HttpMessageConverter自动帮我们做了转换的操作。
默认情况下RestTemplate会自动帮我们注册一组HttpMessageConverter,如源码所示:
/**
* Create a new instance of the {@link RestTemplate} using default settings.
* Default {@link HttpMessageConverter}s are initialized.
*/
public RestTemplate() {
this.messageConverters.add(new ByteArrayHttpMessageConverter());
this.messageConverters.add(new StringHttpMessageConverter());
this.messageConverters.add(new ResourceHttpMessageConverter());
this.messageConverters.add(new SourceHttpMessageConverter<Source>());
this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
if (romePresent) {
this.messageConverters.add(new AtomFeedHttpMessageConverter());
this.messageConverters.add(new RssChannelHttpMessageConverter());
}
if (jackson2XmlPresent) {
this.messageConverters.add(new MappingJackson2XmlHttpMessageConverter());
}
else if (jaxb2Present) {
this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
}
if (jackson2Present) {
this.messageConverters.add(new MappingJackson2HttpMessageConverter());
}
else if (gsonPresent) {
this.messageConverters.add(new GsonHttpMessageConverter());
}
}
设置拦截器 ClientHttpRequestInterceptor
有时候需要对请求做一些通用拦截设置,这就可以使用拦截器进行处理。
拦截器需要我们实现org.springframework.http.client.ClientHttpRequestInterceptor接口。
下面是设置基础验证拦截器的代码:
/**
* RestTemplate的基础验证拦截器
*
* @author plsy
*/
public class AuthorizationInterceptor implements ClientHttpRequestInterceptor {
private String username = "xxx";
private String password = "xxxxxx";
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
HttpHeaders headers = request.getHeaders();
String plainCreds = username + ":" + password;
String base64Creds = new String(Base64.encodeBase64(plainCreds.getBytes()));
headers.add(HttpHeaders.AUTHORIZATION, "Basic " + base64Creds);
return execution.execute(request, body);
}
}
网友评论