背景
首次接触到 RestTemplate,是在SpringCloud的项目中。模块之间的调用走http协议,形式上有两种写法,其中一种是通过RestTemplate调用微服务其他模块的接口,另一种方式是推荐的更加简洁的使用feign相关的注解
这个 RestTemplate 其实可以替代很多http的工具,常见的有okHttp,httpComponent(httpclient),JDK自带的java.net.HttpURLConnection
使用
类依赖jar包,来自 spring-boot-starter-web 中的 org.springframework:spring-web
- 要使用先new,比如直接
RestTemplate restTemplate = new RestTemplate()
后即可使用 - 或者使用 @Bean,复用这个。RestTemplate 是线程安全的。
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
进阶使用以及设置请求的具体实现
所谓 “请求的具体实现” 是指RestTemplate的具体的实现方式可以是JDK自带的java.net.HttpURLConnection,也可以是apache的HTTPComponents,还可以是OkHttp。
默认情况下是JDK的实现,用于处理发出的http请求。如何修改?
看下面的例子,设置requestfactory即可
package com.wyf.test.resttemplatetest.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.List;
/**
* RestTemplate 的配置类
*
* @author Stone
* @version V1.0.0
* @date 2019/12/16
*/
@Configuration
public class RestTemplateConfig {
/**
* 【版本1】不建议使用这个
* 1、readTimeout和connectTimeout默认都不超时
* 2、处理请求的底层类是:java.net.HttpURLConnection
*
* @return
*/
@Primary
@Bean("restTemplate")
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
return setStingHttpMessageConverterEncoding(restTemplate);
}
/**
* 【版本2】
* 1、设置了超时时间(当然也可以设置永不超时,setReadTimeout=0则永不超时)
* 2、设置了处理请求的底层类(java.net.HttpURLConnection、HTTPComponents、OkHttp)
*
* @return
*/
@Bean("restTemplateWithConfig")
public RestTemplate restTemplateWithConfig() {
// 要用哪个具体实现就设置哪个ClientHttpRequestFactory
// JDK的java.net.HttpURLConnection(直接new RestTemplate() 默认的实现方式)
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(15000);
factory.setReadTimeout(5000);
// Http Client(Http Component),必须导入对应GAV
// HttpComponentsClientHttpRequestFactory factory2 = new HttpComponentsClientHttpRequestFactory();
// factory2.setConnectTimeout(15000);
// factory2.setReadTimeout(5000);
// OKHttp3,必须导入对应GAV
// OkHttp3ClientHttpRequestFactory factory3 = new OkHttp3ClientHttpRequestFactory();
// factory3.setConnectTimeout(15000);
// factory3.setReadTimeout(5000);
RestTemplate restTemplateWithConfig = new RestTemplate(factory);
return setStingHttpMessageConverterEncoding(restTemplateWithConfig);
}
/**
* 设置 StringHttpMessageConverter 为 UTF-8编码
*
* @param restTemplate
* @return
*/
private RestTemplate setStingHttpMessageConverterEncoding(RestTemplate restTemplate) {
List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
if (converterList != null) {
Iterator<HttpMessageConverter<?>> itr = converterList.iterator();
while (itr.hasNext()) {
HttpMessageConverter<?> httpMessageConverter = itr.next();
if (httpMessageConverter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(Charset.forName("UTF-8"));
}
}
}
return restTemplate;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135295.html