zoukankan      html  css  js  c++  java
  • HTTP中get、post请求工具类

    package com.panchan.m2.utils;
    
    import java.io.IOException;
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.concurrent.TimeUnit;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpStatus;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.config.Registry;
    import org.apache.http.config.RegistryBuilder;
    import org.apache.http.config.SocketConfig;
    import org.apache.http.conn.DnsResolver;
    import org.apache.http.conn.HttpConnectionFactory;
    import org.apache.http.conn.ManagedHttpClientConnection;
    import org.apache.http.conn.routing.HttpRoute;
    import org.apache.http.conn.socket.ConnectionSocketFactory;
    import org.apache.http.conn.socket.PlainConnectionSocketFactory;
    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    import org.apache.http.impl.DefaultConnectionReuseStrategy;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
    import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.impl.conn.DefaultHttpResponseParserFactory;
    import org.apache.http.impl.conn.ManagedHttpClientConnectionFactory;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import org.apache.http.impl.conn.SystemDefaultDnsResolver;
    import org.apache.http.impl.io.DefaultHttpRequestWriterFactory;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    /**
     * @Description HTTP请求(GET/POST)工具
     * @version 1.0
     * @since JDK1.8
     * @author huyanlon
     * @Created on 2019年3月28日
     */
    public class HttpClientHelper {
    
        private static Logger log = LoggerFactory.getLogger(HttpClientHelper.class);
    
        private static PoolingHttpClientConnectionManager poolConnManager = null;
        
        private static CloseableHttpClient httpClient =null;
        
        public static synchronized CloseableHttpClient getHttpClient(){
            if(null==httpClient){
                //注册访问协议相关的Socket工厂
                Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
                        .register("http",PlainConnectionSocketFactory.getSocketFactory())
                        .register("https", SSLConnectionSocketFactory.getSystemSocketFactory()).build();
                
                //HttpConnection工厂:皮遏制写请求/解析响应处理器            
                HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connectionFactory=new
                        ManagedHttpClientConnectionFactory(DefaultHttpRequestWriterFactory.INSTANCE,
                                DefaultHttpResponseParserFactory.INSTANCE);
                //DNS解析器
                DnsResolver  dnsResolver=SystemDefaultDnsResolver.INSTANCE;
    
                //创建池化连接管理器
                poolConnManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry,connectionFactory,dnsResolver);
                //默认为Socket配置
                SocketConfig defaultSocketConfig=SocketConfig.custom().setTcpNoDelay(true).build();
                poolConnManager.setDefaultSocketConfig(defaultSocketConfig);
                
                // 设置整个连接池的最大连接数
                poolConnManager.setMaxTotal(1000);
                // 每个路由的默认最大连接,每个路由实际最大连接默认为DefaultMaxPerRoute控制,maxTotal是整个池子最大数
                // DefaultMaxPerRoute设置过小无法支持大并发(ConnectPoolTimeoutException: Timeout waiting for connect from pool) 路由是maxTotal的细分
                //每个路由最大连接数
                poolConnManager.setDefaultMaxPerRoute(1000);
                //在从连接池获取连接时,连接不活跃多长时间后需要一次验证,默认2S
                poolConnManager.setValidateAfterInactivity(5*1000);
                
                //默认请求配置
                RequestConfig requestConfig = RequestConfig.custom()
                        //设置连接超时时间
                        .setConnectTimeout(2*1000)
                        //设置等待数据超时时间
                        .setSocketTimeout(5*1000)
                        //设置从连接池获取连接的等待超时时间
                        .setConnectionRequestTimeout(2000)
                        .build();
                
                HttpClientBuilder httpClientBuilder = HttpClients.custom();
                httpClientBuilder.setConnectionManager(poolConnManager)
                //设置连接池不是共享模式
                .setConnectionManagerShared(false)
                //定期回调空闲连接
                .evictIdleConnections(60, TimeUnit.SECONDS)
                //定期回收过期
                .evictExpiredConnections()
                //连接存活时间,如果不设置,根据长连接信息决定
                .setConnectionTimeToLive(60, TimeUnit.SECONDS)
                //设置默认请求配置
                .setDefaultRequestConfig(requestConfig)
                // 连接重试策略,是否能keepalive
                .setConnectionReuseStrategy(DefaultConnectionReuseStrategy.INSTANCE)
                //长连接配置,即获取长连接生产多少时间
                .setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
                //设置重试次数,默认是3次;当前是禁用
                .setRetryHandler(new DefaultHttpRequestRetryHandler(0, false));
    
                httpClient = httpClientBuilder.build();
    
                //JVM停止或重启时,关闭连接池释放连接
                Runtime.getRuntime().addShutdownHook(new Thread(){
                    public void run(){
                        try{
                            httpClient.close();
                        }catch(IOException e){
                            log.info(e.getMessage());
                        }
                    }
                });
                
            }
            return httpClient;
        }
    
        
        /**
         * 发送 GET 请求(HTTP),不带输入数据
         * 
         * @param url
         * @return
         */
        public static String doGet(String url) {
            return doGet(url, new HashMap<String, Object>());
        }
    
        /**
         * 发送 GET 请求(HTTP),K-V形式
         * 
         * @param url
         * @param params
         * @return
         */
        public static String doGet(String url, Map<String, Object> params) {
            long a=System.currentTimeMillis();
            String apiUrl = url;
            StringBuffer param = new StringBuffer();
            int i = 0;
            for (String key : params.keySet()) {
                if (i == 0) {
                    param.append("?");
                } else {
                    param.append("&");
                }
                param.append(key).append("=").append(params.get(key));
                i++;
            }
            apiUrl += param;
            String result = null;
            CloseableHttpClient httpClient = getHttpClient();
            CloseableHttpResponse response = null;
            HttpGet httpPost = null;
            try {
                httpPost = new HttpGet(apiUrl);
                response = httpClient.execute(httpPost);
                int status = response.getStatusLine().getStatusCode();
    
                if (status ==HttpStatus.SC_OK) {
                    HttpEntity entity = response.getEntity();
                    if (entity != null) {
                        result = EntityUtils.toString(response.getEntity(), "UTF-8");
                    }
                }else{
                    //不推荐使用CloseableHttpResponse.close关闭连接,他将直接关闭Socket,导致长连接不能复用
                    EntityUtils.consume(response.getEntity());                
                }
                
                StringBuilder logsb=new StringBuilder();
                logsb.append("##################
    ");
                logsb.append("# 发送报文:"+getPlanText(params)+"
    ");
                logsb.append("# 响应代码:"+status+"
    ");
                logsb.append("# 响应报文:"+result+"
    ");
                logsb.append("# 耗时:"+(System.currentTimeMillis()-a)+"
    ");
                logsb.append("########################################################################
    ");
                log.info(logsb.toString());
                
                return result;
    
            } catch (IOException e) {
                try {
                    if(null !=response )
                        EntityUtils.consume(response.getEntity());
                } catch (IOException e1) {
                    log.error(e.getMessage(), e1);
                }    
                log.error(e.getMessage(), e);
            } 
            return result;
        }
    
        public static String doPost(String url) {
            return doPost(url, new HashMap<String, Object>());
        }
    
        /**
         * 发送 POST 请求(HTTP),K-V形式
         * 
         * @param url
         *            接口URL
         * @param params
         *            参数map
         * @return
         */
        public static String doPost(String url, Map<String, Object> params) {
            long a=System.currentTimeMillis();
            String result = null;
            HttpPost httpPost = new HttpPost(url);
            CloseableHttpClient httpClient = getHttpClient();
            CloseableHttpResponse response = null;
            try {
                List<NameValuePair> pairList = new ArrayList<>(params.size());
                for (Map.Entry<String, Object> entry : params.entrySet()) {
                    NameValuePair pair = new BasicNameValuePair(entry.getKey(),entry.getValue().toString());
                    pairList.add(pair);
                }
                httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));
                response = httpClient.execute(httpPost);
                int status = response.getStatusLine().getStatusCode();
                if (status ==HttpStatus.SC_OK) {
                    HttpEntity entity = response.getEntity();
                    if (entity != null) {
                        result = EntityUtils.toString(response.getEntity(), "UTF-8");
                    }
                }else{
                    //不推荐使用CloseableHttpResponse.close关闭连接,他将直接关闭Socket,导致长连接不能复用
                    EntityUtils.consume(response.getEntity());                
                }
                
                StringBuilder logsb=new StringBuilder();
                logsb.append("##################
    ");
                logsb.append("# 发送报文:"+getPlanText(params)+"
    ");
                logsb.append("# 响应代码:"+status+"
    ");
                logsb.append("# 响应报文:"+result+"
    ");
                logsb.append("# 耗时:"+(System.currentTimeMillis()-a)+"
    ");
                logsb.append("########################################################################
    ");
                log.info(logsb.toString());
                
                return result;
    
            } catch (Exception e) {
                try {
                    if(null !=response )
                        EntityUtils.consume(response.getEntity());
                } catch (IOException e1) {
                    log.error(e.getMessage(), e1);
                }    
                log.error(e.getMessage(), e);
            }
            return result;
        }
        
        /**
         * 参数Map格式化
         * @param map
         * @return
         */
        public static String getPlanText(Map<String, Object> map) {
            StringBuilder sb=new StringBuilder();
            for(Map.Entry<String, Object> entry :map.entrySet()){
                    sb.append(entry.getKey()).
                    append("=").
                    append(entry.getValue())
                    .append("&");
            }
            if(sb.length()>0){
                sb.deleteCharAt(sb.length()-1);
            }
          return sb.toString(); 
        }
        
    }
  • 相关阅读:
    LeetCode 769. Max Chunks To Make Sorted
    LeetCode 845. Longest Mountain in Array
    LeetCode 1059. All Paths from Source Lead to Destination
    1129. Shortest Path with Alternating Colors
    LeetCode 785. Is Graph Bipartite?
    LeetCode 802. Find Eventual Safe States
    LeetCode 1043. Partition Array for Maximum Sum
    LeetCode 841. Keys and Rooms
    LeetCode 1061. Lexicographically Smallest Equivalent String
    LeetCode 1102. Path With Maximum Minimum Value
  • 原文地址:https://www.cnblogs.com/huyanlon/p/10641154.html
Copyright © 2011-2022 走看看