SpringBoot配置RestTemplate的代理和超时时间
application.properties:
1 #代理设置 2 proxy.enabled=false 3 proxy.host=192.168.18.233 4 proxy.port=8888 5 6 #REST超时配置 7 rest.ReadTimeout=35000 8 rest.ConnectTimeout=5000
代理配置类:
1 import org.springframework.boot.context.properties.ConfigurationProperties; 2 import org.springframework.stereotype.Component; 3 4 import lombok.Data; 5 6 /** 7 * 网络代理设置 8 * 9 * @author yangzhilong 10 * 11 */ 12 @Component 13 @ConfigurationProperties(prefix="proxy") 14 @Data 15 public class ProxyConfig { 16 /** 17 * 是否启用代理 18 */ 19 private Boolean enabled; 20 /** 21 * 代理主机地址 22 */ 23 private String host; 24 /** 25 * 代理端口 26 */ 27 private Integer port; 28 }
SpringBoot的Configuration:
1 import java.net.InetSocketAddress; 2 import java.net.Proxy; 3 import java.net.SocketAddress; 4 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.beans.factory.annotation.Value; 7 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 8 import org.springframework.context.annotation.Bean; 9 import org.springframework.context.annotation.Configuration; 10 import org.springframework.http.client.SimpleClientHttpRequestFactory; 11 import org.springframework.web.client.RestTemplate; 12 13 import com.yzl.vo.ProxyConfig; 14 15 @Configuration 16 @ConditionalOnClass(ProxyConfig.class) 17 public class RestConfiguration { 18 @Value("${rest.ReadTimeout}") 19 private int readTimeout; 20 @Value("${rest.ConnectTimeout}") 21 private int connectionTimeout; 22 @Autowired 23 private ProxyConfig proxyConfig; 24 25 @Bean 26 public SimpleClientHttpRequestFactory httpClientFactory() { 27 SimpleClientHttpRequestFactory httpRequestFactory = new SimpleClientHttpRequestFactory(); 28 httpRequestFactory.setReadTimeout(readTimeout); 29 httpRequestFactory.setConnectTimeout(connectionTimeout); 30 31 if(proxyConfig.getEnabled()){ 32 SocketAddress address = new InetSocketAddress(proxyConfig.getHost(), proxyConfig.getPort()); 33 Proxy proxy = new Proxy(Proxy.Type.HTTP, address); 34 httpRequestFactory.setProxy(proxy); 35 } 36 37 return httpRequestFactory; 38 } 39 40 @Bean 41 public RestTemplate restTemplate(SimpleClientHttpRequestFactory httpClientFactory) { 42 RestTemplate restTemplate = new RestTemplate(httpClientFactory); 43 return restTemplate; 44 } 45 }
如果不希望这种全局的超时时间污染正常的SpringCloud中restTemplate的时间设置,可以使用如下方法:
1 package com.yzl.autoconfig; 2 3 import org.springframework.beans.factory.annotation.Value; 4 import org.springframework.context.annotation.Bean; 5 import org.springframework.context.annotation.Configuration; 6 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; 7 import org.springframework.web.client.RestTemplate; 8 9 import com.yzl.util.RestClient; 10 11 /** 12 * 工具类引导装配类 13 * @author yangzhilong 14 * 15 */ 16 @Configuration 17 public class RestClientAutoConfiguration { 18 @Value("${rest.config.connectTimeout:10000}") 19 private int connectTimeout; 20 @Value("${rest.config.readTimeout:30000}") 21 private int readTimeout; 22 23 /** 24 * 使用Bootstrap来装配RestClient中的RestTemplate属性, 25 * 避免直接装配RestTemplate来污染了正常的spring Cloud的调用 26 * @return 27 */ 28 @Bean 29 public RestClientBootstrap bootstrap(){ 30 HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory(); 31 httpRequestFactory.setConnectTimeout(connectTimeout); 32 httpRequestFactory.setReadTimeout(readTimeout); 33 RestTemplate restTemplate = new RestTemplate(httpRequestFactory); 34 RestClient.setRestTemplate(restTemplate); 35 return new RestClientBootstrap(); 36 } 37 38 /** 39 * 空的引导类 40 * @author yangzhilong 41 * 42 */ 43 static class RestClientBootstrap { 44 45 } 46 }
RestClient工具类:
package com.nike.gcsc.auth.utils; import java.util.Map; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import com.alibaba.fastjson.JSON; /** * HTTP Rest Util * @author yangzhilong * */ public class RestClient { private static RestTemplate restTemplate; /** * @param client */ public static void setRestTemplate(RestTemplate client) { restTemplate = client; } /** * * @param <T> * @param url * @param clasz * @return */ public static <T> T get(String url, Class<T> clasz) { return restTemplate.getForObject(url , clasz); } /** * * @param <T> * @param url * @param headMap * @param bodyObj * @param clasz * @return */ public static <T> T postJson(String url, Map<String, String> headMap, Object bodyObj, Class<T> clasz) { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); headers.setContentType(type); headers.add("Accept", MediaType.APPLICATION_JSON.toString()); if(null != headMap) { headMap.entrySet().forEach(item -> { headers.add(item.getKey(), item.getValue()); }); } String result = null; if(bodyObj == null){ result = "{}"; }else{ result = JSON.toJSONString(bodyObj); } HttpEntity<String> formEntity = new HttpEntity<String>(result,headers); return restTemplate.postForObject(url , formEntity, clasz); } /** * * @param <T> * @param url * @param attrMap * @param clasz * @return */ public static <T> T postForm(String url, Map<String , String> attrMap, Class<T> clasz){ HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); MultiValueMap<String, String> params= new LinkedMultiValueMap<>(); attrMap.entrySet().forEach(item -> { params.add(item.getKey() , item.getValue()); }); HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers); return restTemplate.exchange(url, HttpMethod.POST, requestEntity, clasz).getBody(); } }
然后实际发起HTTP请求的时候使用上面的工具类