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请求的时候使用上面的工具类

posted @ 2017-03-29 15:55  自行车上的程序员  阅读(40943)  评论(3编辑  收藏  举报