版权声明:看什么?6,你和我,走一波! https://blog.csdn.net/qq_31323797/article/details/86524717
1 RestTemplateConfig
package com.gp6.springboot32.config;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
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.StandardCharsets;
import java.util.List;
/**
* RestTemplate配置
*
* @author gp6
* @date 2019-01-16
*/
@Configuration
public class RestTemplateConfig {
@Value("${rest.readTimeOut}")
private Integer readTimeOut;
@Value("${rest.connectTimeOut}")
private Integer connectTimeOut;
@Value("${rest.maxConnectPerRoute}")
private Integer maxConnectPerRoute;
@Value("${rest.maxTotalConnect}")
private Integer maxTotalConnect;
// 创建HTTP客户端工厂
@Bean
public ClientHttpRequestFactory createFactory() {
if (maxTotalConnect <= 0) {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(connectTimeOut);
factory.setReadTimeout(readTimeOut);
return factory;
}
HttpClient httpClient = HttpClientBuilder.create().setMaxConnTotal(this.maxTotalConnect)
.setMaxConnPerRoute(this.maxConnectPerRoute).build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(
httpClient);
factory.setConnectTimeout(connectTimeOut);
factory.setReadTimeout(readTimeOut);
return factory;
}
// 初始化RestTemplate,并加入spring的Bean工厂,由spring统一管理
@Bean
@ConditionalOnMissingBean(RestTemplate.class)
public RestTemplate getRestTemplate() {
RestTemplate restTemplate = new RestTemplate(this.createFactory());
List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
// 重新设置StringHttpMessageConverter字符集为UTF-8,解决中文乱码问题
HttpMessageConverter<?> converterTarget = null;
for (HttpMessageConverter<?> item : converterList) {
if (StringHttpMessageConverter.class == item.getClass()) {
converterTarget = item;
break;
}
}
if (null != converterTarget) {
converterList.remove(converterTarget);
}
converterList.add(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
//加入FastJson转换器 根据使用情况进行操作,此段注释,默认使用jackson
//converterList.add(new FastJsonHttpMessageConverter4());
return restTemplate;
}
}
2 RestTemplateService
package com.gp6.springboot32.service;
import org.springframework.http.ResponseEntity;
import org.springframework.lang.Nullable;
import org.springframework.web.client.RestClientException;
import java.net.URI;
import java.util.Map;
/**
* RestTemplate接口
*
* @author gp6
* @date 2019-01-16
*/
public interface RestTemplateService {
/**
* GET----获取对象
*
* @param uri 请求uri
* @param t 返回值的类型
* @param <T> 泛型
* @return 获取的对象
*/
<T> T getForObject(URI uri, Class<T> t);
/**
* GET----获取数组
*
* @param url 请求url
* @param responseType 返回值的类型
* @param <T> 泛型
* @param uriVariables 参数数组
* @return 获取的对象
*/
<T> T getForObject(String url, Class<T> responseType, Object... uriVariables);
/**
* GET----请求带有参数
*/
<T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables);
<T> ResponseEntity<T> getForEntity(URI uri, Class<T> responseType);
<T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables);
<T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables);
// POST
<T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException;
<T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException;
<T> T postForObject(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException;
<T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException;
<T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException;
<T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException;
// PUT
void put(String url, @Nullable Object request, Object... uriVariables);
void put(String url, @Nullable Object request, Map<String, ?> uriVariables);
void put(URI url, @Nullable Object request) throws RestClientException;
// DELETE
void delete(String url, Object... uriVariables) throws RestClientException;
void delete(String url, Map<String, ?> uriVariables) throws RestClientException;
void delete(URI url) throws RestClientException;
}
3 RestTemplateServiceImpl
package com.gp6.springboot32.service.impl;
import com.gp6.springboot32.service.RestTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import java.net.URI;
import java.util.Map;
/**
* RestTemplate实现类
*
* @author gp6
* @date 2019-01-16
*/
@Service
public class RestTemplateServiceImpl implements RestTemplateService {
@Autowired
private RestTemplate restTemplate;
@Override
public <T> T getForObject(URI uri, Class<T> t) {
return restTemplate.getForObject(uri, t);
}
@Override
public <T> T getForObject(String url, Class<T> t, Object... object) {
return restTemplate.getForObject(url, t, object);
}
@Override
public <T> T getForObject(String url, Class<T> t, Map<String, ?> map) {
return restTemplate.getForObject(url, t, map);
}
@Override
public <T> ResponseEntity<T> getForEntity(URI uri, Class<T> t) {
return restTemplate.getForEntity(uri, t);
}
@Override
public <T> ResponseEntity<T> getForEntity(String url, Class<T> t, Object... object) {
return restTemplate.getForEntity(url, t, object);
}
@Override
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables) {
return restTemplate.getForEntity(url, responseType, uriVariables);
}
@Override
@Nullable
public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException {
return restTemplate.postForObject(url, request, responseType, uriVariables);
}
@Override
@Nullable
public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
return restTemplate.postForObject(url, request, responseType, uriVariables);
}
@Override
@Nullable
public <T> T postForObject(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException {
return restTemplate.postForObject(url, request, responseType);
}
@Override
public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException {
return restTemplate.postForEntity(url, request, responseType, uriVariables);
}
@Override
public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
return restTemplate.postForEntity(url, request, responseType, uriVariables);
}
@Override
public <T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException {
return restTemplate.postForEntity(url, request, responseType);
}
// PUT
@Override
public void put(String url, @Nullable Object request, Object... uriVariables)
throws RestClientException {
restTemplate.put(url, request, uriVariables);
}
@Override
public void put(String url, @Nullable Object request, Map<String, ?> uriVariables)
throws RestClientException {
restTemplate.put(url, request, uriVariables);
}
@Override
public void put(URI url, @Nullable Object request) throws RestClientException {
restTemplate.put(url, request);
}
// DELETE
@Override
public void delete(String url, Object... uriVariables) throws RestClientException {
restTemplate.delete(url, uriVariables);
}
@Override
public void delete(String url, Map<String, ?> uriVariables) throws RestClientException {
restTemplate.delete(url, uriVariables);
}
@Override
public void delete(URI url) throws RestClientException {
restTemplate.delete(url);
}
}
4 配置文件
# RestTemplate
rest:
# 读取超时时间 单位:毫秒
readTimeOut: 3000
# 连接超时时间
connectTimeOut: 2000
# 单个主机的最大连接数
maxConnectPerRoute: 20
# 连接池的最大连接池
maxTotalConnect: 0
5 测试
package com.gp6.springboot32.controller;
import com.gp6.springboot32.service.RestTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import java.net.URI;
import java.net.URISyntaxException;
@Controller
@RequestMapping({"test"})
public class HelloController {
@Autowired
private RestTemplateService restTemplateService;
@GetMapping(value = "{id}")
public void selectFbaOutApplyById(@PathVariable("id") Integer id) throws URISyntaxException {
URI uri = new URI("http://192.168.8.36:8081/rest/item/cat?id=2");
ResponseEntity<String> a = restTemplateService.getForEntity(uri, String.class);
System.out.println(a);
}
}