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

  • 相关阅读:
    cstc2018 混合果汁
    CF1086E Beautiful Matrix
    AT2000 Leftmost Ball
    CF1208E Let Them Slide
    CF1208D Restore Permutation
    【置顶】博客公告
    [NOI2015]软件包管理器
    【noip2018】积木大赛
    几天连测总结
    【ZJOI2007】棋盘制作
  • 原文地址:https://www.cnblogs.com/yangzhilong/p/6640207.html
Copyright © 2020-2023  润新知