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;
@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;
@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;
}
@Bean
@ConditionalOnMissingBean(RestTemplate.class)
public RestTemplate getRestTemplate() {
RestTemplate restTemplate = new RestTemplate(this.createFactory());
List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
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));
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;
public interface RestTemplateService {
<T> T getForObject(URI uri, Class<T> t);
<T> T getForObject(String url, Class<T> responseType, Object... uriVariables);
<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);
<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;
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;
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;
@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);
}
@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);
}
@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);
}
}