zoukankan      html  css  js  c++  java
  • HttpPoolUtils 连接池管理的GET POST请求

      1 package com.nextjoy.projects.usercenter.util.http;
      2 
      3 import org.apache.http.Consts;
      4 import org.apache.http.HttpEntity;
      5 import org.apache.http.HttpHeaders;
      6 import org.apache.http.NameValuePair;
      7 import org.apache.http.client.config.RequestConfig;
      8 import org.apache.http.client.entity.UrlEncodedFormEntity;
      9 import org.apache.http.client.methods.CloseableHttpResponse;
     10 import org.apache.http.client.methods.HttpGet;
     11 import org.apache.http.client.methods.HttpPost;
     12 import org.apache.http.config.*;
     13 import org.apache.http.conn.socket.ConnectionSocketFactory;
     14 import org.apache.http.conn.socket.PlainConnectionSocketFactory;
     15 import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
     16 import org.apache.http.impl.DefaultConnectionReuseStrategy;
     17 import org.apache.http.impl.client.CloseableHttpClient;
     18 import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
     19 import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
     20 import org.apache.http.impl.client.HttpClients;
     21 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
     22 import org.apache.http.message.BasicNameValuePair;
     23 import org.apache.http.ssl.SSLContexts;
     24 import org.apache.http.util.EntityUtils;
     25 import org.slf4j.Logger;
     26 import org.slf4j.LoggerFactory;
     27 
     28 import javax.net.ssl.SSLContext;
     29 import java.io.IOException;
     30 import java.net.URI;
     31 import java.net.URLEncoder;
     32 import java.nio.charset.CodingErrorAction;
     33 import java.util.*;
     34 import java.util.Map.Entry;
     35 
     36 /**
     37  * 基于apache httpclient 4.3X以上版本连接池管理的GET POST请求
     38  *
     39  * @see PoolingHttpClientConnectionManager
     40  *
     41  * @author Vincent
     42  *
     43  */
     44 public class HttpPoolUtils {
     45     private final static Logger LOG = LoggerFactory.getLogger(HttpPoolUtils.class);
     46     private static PoolingHttpClientConnectionManager connManager = null;
     47     private static CloseableHttpClient httpclient = null;
     48     /** 默认UA */
     49     private static final String DEFAULT_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36";
     50     /** 默认编码 */
     51     public static final String DEFAULT_ENCODING = "UTF-8";
     52     /** 最大连接数 */
     53     public final static int MAX_TOTAL_CONNECTIONS = 5;
     54     /** 每个路由最大连接数 */
     55     public final static int MAX_PER_ROUTE = 2;
     56     /** 连接超时时间 */
     57     public static final int CONNECT_TIMEOUT = 50000;
     58     /** 等待数据超时时间 */
     59     public static final int SO_TIMEOUT = 20000;
     60     /** 连接池连接不足超时等待时间 */
     61     public static final int CONN_MANAGER_TIMEOUT = 500;
     62 
     63     private static final RequestConfig DEFAULT_REQUESTCONFIG = RequestConfig.custom().setSocketTimeout(SO_TIMEOUT).setConnectTimeout(CONNECT_TIMEOUT)
     64             .setConnectionRequestTimeout(CONN_MANAGER_TIMEOUT).setExpectContinueEnabled(false).build();
     65 
     66     static {
     67         try {
     68             SSLContext sslContext = SSLContexts.custom().build();
     69             // TODO 如有需要自行添加相关证书 sslContext.init...
     70 
     71             Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
     72                     .register("http", PlainConnectionSocketFactory.INSTANCE).register("https", new SSLConnectionSocketFactory(sslContext)).build();
     73 
     74             connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
     75             httpclient = HttpClients.custom().setConnectionManager(connManager).setRetryHandler(new DefaultHttpRequestRetryHandler(0, false))
     76                     .setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy()).setConnectionReuseStrategy(new DefaultConnectionReuseStrategy())
     77                     .setUserAgent(DEFAULT_USER_AGENT).build();
     78             SocketConfig socketConfig = SocketConfig.custom().setTcpNoDelay(true).build();
     79             connManager.setDefaultSocketConfig(socketConfig);
     80             MessageConstraints messageConstraints = MessageConstraints.custom().build();
     81             ConnectionConfig connectionConfig = ConnectionConfig.custom().setMalformedInputAction(CodingErrorAction.IGNORE)
     82                     .setUnmappableInputAction(CodingErrorAction.IGNORE).setCharset(Consts.UTF_8).setMessageConstraints(messageConstraints).build();
     83             connManager.setDefaultConnectionConfig(connectionConfig);
     84             connManager.setMaxTotal(MAX_TOTAL_CONNECTIONS);
     85             connManager.setDefaultMaxPerRoute(MAX_PER_ROUTE);
     86         } catch (Exception e) {
     87             LOG.error("some error is init, please check it.", e);
     88         }
     89     }
     90 
     91     /**
     92      * post请求
     93      *
     94      * @param url
     95      *            请求URL
     96      * @param params
     97      *            参数
     98      * @param contentType
     99      *            格式
    100      * @param userAgent
    101      *            UA
    102      * @param encoding
    103      *            编码
    104      * @return
    105      */
    106     public static String post(String url, Map<String, String> params, String contentType, String userAgent, String encoding) {
    107         String data = "";
    108         HttpPost httpPost = new HttpPost();
    109         CloseableHttpResponse response = null;
    110         try {
    111             httpPost.setURI(new URI(url));
    112             if (contentType != null && contentType != "") {
    113                 httpPost.setHeader(HttpHeaders.CONTENT_TYPE, contentType);
    114             } else {
    115                 httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "text/html");
    116             }
    117             if (userAgent != null && userAgent != "") {
    118                 httpPost.setHeader(HttpHeaders.USER_AGENT, userAgent);
    119             }
    120             RequestConfig requestConfig = RequestConfig.copy(DEFAULT_REQUESTCONFIG).build();
    121             httpPost.setConfig(requestConfig);
    122 
    123             List<NameValuePair> nvps = new ArrayList<NameValuePair>();
    124             if (params != null) {
    125                 for (Entry<String, String> entry : params.entrySet()) {
    126                     nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
    127                 }
    128             }
    129             httpPost.setEntity(new UrlEncodedFormEntity(nvps));
    130             // LOG.debug(String.format("[HttpPoolUtils Post] begin invoke url:
    131             // %s , params: %s",url,params.toString()));
    132             response = httpclient.execute(httpPost);
    133             HttpEntity entity = response.getEntity();
    134             if (entity != null) {
    135                 data = EntityUtils.toString(entity, encoding);
    136                 // LOG.debug(String.format("[HttpPoolUtils Post]Debug response,
    137                 // url :%s , response string :%s",url,data));
    138             }
    139         } catch (Exception e) {
    140             LOG.error("[HttpPoolUtils Post] is error. ", e);
    141         } finally {
    142             if (response != null) {
    143                 try {
    144                     EntityUtils.consume(response.getEntity());
    145                 } catch (IOException e) {
    146                     e.printStackTrace();
    147                 }
    148             }
    149             httpPost.reset();
    150         }
    151         return data;
    152     }
    153 
    154     /**
    155      * Get请求方式
    156      *
    157      * @param url
    158      *            请求URL
    159      * @param params
    160      *            参数
    161      * @param contentType
    162      *            格式
    163      * @param userAgent
    164      *            UA
    165      * @param encoding
    166      *            编码
    167      * @return
    168      */
    169     public static String get(String url, Map<String, String> params, String contentType, String userAgent, String encoding) {
    170         String data = "";
    171         HttpGet httpGet = new HttpGet();
    172         CloseableHttpResponse response = null;
    173         try {
    174             StringBuilder sb = new StringBuilder();
    175             sb.append(url);
    176             boolean first = true;
    177             if (params != null) {
    178                 for (Entry<String, String> entry : params.entrySet()) {
    179                     if (first && !url.contains("?")) {
    180                         sb.append("?");
    181                     } else {
    182                         sb.append("&");
    183                     }
    184                     sb.append(entry.getKey());
    185                     sb.append("=");
    186                     String value = entry.getValue();
    187                     sb.append(URLEncoder.encode(value, "UTF-8"));
    188                     first = false;
    189                 }
    190             }
    191 
    192             // LOG.info("[HttpPoolUtils Get] begin invoke:" + sb.toString());
    193             httpGet.setURI(new URI(sb.toString()));
    194             RequestConfig requestConfig = RequestConfig.copy(DEFAULT_REQUESTCONFIG).build();
    195             httpGet.setConfig(requestConfig);
    196             if (contentType != null && contentType != "") {
    197                 httpGet.setHeader(HttpHeaders.CONTENT_TYPE, contentType);
    198             } else {
    199                 httpGet.setHeader(HttpHeaders.CONTENT_TYPE, "text/html");
    200             }
    201             if (userAgent != null && userAgent != "") {
    202                 httpGet.setHeader(HttpHeaders.USER_AGENT, userAgent);
    203             }
    204 
    205             response = httpclient.execute(httpGet);
    206             HttpEntity entity = response.getEntity();
    207             if (entity != null) {
    208                 data = EntityUtils.toString(entity, encoding);
    209             }
    210             // LOG.debug(String.format("[HttpPoolUtils Get]Debug url:%s ,
    211             // response data %s:",sb.toString(),data));
    212         } catch (Exception e) {
    213             LOG.error(String.format("[HttpPoolUtils Get]invoke get error, url:%s, para:%s", url, params.toString()), e);
    214         } finally {
    215             if (response != null) {
    216                 try {
    217                     EntityUtils.consume(response.getEntity());
    218                 } catch (IOException e) {
    219                     e.printStackTrace();
    220                 }
    221             }
    222             httpGet.reset();
    223         }
    224         return data;
    225     }
    226 
    227     public static void main0(String[] args) throws Exception {
    228         long start = System.currentTimeMillis();
    229         Random r = new Random();
    230         for (int i = 0; i < 20; i++) {
    231             long startPer = System.currentTimeMillis();
    232             String url = "https://www.baidu.com/s?wd=" + r.nextInt(5000);
    233             String data = get(url, Collections.<String, String> emptyMap(), null, null, HttpPoolUtils.DEFAULT_ENCODING);
    234             System.out.println("结果长度:" + data.length());
    235             System.out.println("单次请求耗时ms:" + (System.currentTimeMillis() - startPer));
    236         }
    237         System.out.println("查询总耗时ms:" + (System.currentTimeMillis() - start));
    238     }
    239 
    240     public static void main1(String[] args) throws Exception {
    241         long start = System.currentTimeMillis();
    242         String url = "http://samworld.samonkey.com/v2_0/media/detail/343";
    243         Map<String, String> params = new HashMap<String, String>();
    244         params.put("userId", "F60D72944B9E236E7C7D219851DB5C62");
    245         params.put("deviceType", "IOS");
    246         params.put("version", "v3.1.3");
    247         String userAgent = "VRStore/3.1.3 (iPhone; iOS 9.3.2; Scale/3.00)";
    248         String contentType = "application/json;charset=UTF-8";
    249         String acceptEncoding = "gzip, deflate";
    250         String encoding = "UTF-8";
    251         // String data = HttpPoolUtils.get(url, params, "application/json",
    252         // userAgent, "UTF-8");
    253         String data = "";
    254         HttpGet httpGet = new HttpGet();
    255         CloseableHttpResponse response = null;
    256         try {
    257             StringBuilder sb = new StringBuilder();
    258             sb.append(url);
    259             boolean first = true;
    260             if (params != null) {
    261                 for (Entry<String, String> entry : params.entrySet()) {
    262                     if (first && !url.contains("?")) {
    263                         sb.append("?");
    264                     } else {
    265                         sb.append("&");
    266                     }
    267                     sb.append(entry.getKey());
    268                     sb.append("=");
    269                     String value = entry.getValue();
    270                     sb.append(URLEncoder.encode(value, "UTF-8"));
    271                     first = false;
    272                 }
    273             }
    274 
    275             // LOG.info("[HttpPoolUtils Get] begin invoke:" + sb.toString());
    276             httpGet.setURI(new URI(sb.toString()));
    277             RequestConfig requestConfig = RequestConfig.copy(DEFAULT_REQUESTCONFIG).build();
    278             httpGet.setConfig(requestConfig);
    279             if (contentType != null && contentType != "") {
    280                 httpGet.setHeader(HttpHeaders.CONTENT_TYPE, contentType);
    281             } else {
    282                 httpGet.setHeader(HttpHeaders.CONTENT_TYPE, "text/html");
    283             }
    284             if (userAgent != null && userAgent != "") {
    285                 httpGet.setHeader(HttpHeaders.USER_AGENT, userAgent);
    286             }
    287             if (acceptEncoding != null && acceptEncoding != "") {
    288                 httpGet.setHeader(HttpHeaders.ACCEPT_ENCODING, acceptEncoding);
    289             }
    290             httpGet.setHeader(HttpHeaders.ACCEPT_LANGUAGE, "zh-Hans-CN;q=1, pl-PL;q=0.9");
    291             httpGet.setHeader(HttpHeaders.ACCEPT, "*/*");
    292             response = httpclient.execute(httpGet);
    293             HttpEntity entity = response.getEntity();
    294             if (entity != null) {
    295                 data = EntityUtils.toString(entity, encoding);
    296             }
    297             // LOG.debug(String.format("[HttpPoolUtils Get]Debug url:%s ,
    298             // response data %s:",sb.toString(),data));
    299         } catch (Exception e) {
    300             LOG.error(String.format("[HttpPoolUtils Get]invoke get error, url:%s, para:%s", url, params.toString()), e);
    301         } finally {
    302             if (response != null) {
    303                 try {
    304                     EntityUtils.consume(response.getEntity());
    305                 } catch (IOException e) {
    306                     e.printStackTrace();
    307                 }
    308             }
    309             httpGet.reset();
    310         }
    311 
    312         System.out.println(data);
    313         System.out.println("查询总耗时ms:" + (System.currentTimeMillis() - start));
    314     }
    315 
    316     public static void main(String[] args) throws Exception {
    317         Map<String, String> param = new HashMap();
    318         param.put("access_token", "70603C5A83DDC1507B00AC52E55C13EA");
    319         param.put("unionid", "1");
    320         String result = HttpPoolUtils.get("https://graph.qq.com/oauth2.0/me", param, null, null, HttpPoolUtils.DEFAULT_ENCODING);
    321         System.out.println(result);
    322 
    323         long start = System.currentTimeMillis();
    324         long startPer = System.currentTimeMillis();
    325         String url = "http://nextjoy.cn/programMan/list_demo.php";
    326         String data = get(url, Collections.<String, String> emptyMap(), null, null, HttpPoolUtils.DEFAULT_ENCODING);
    327         System.out.println("结果长度:" + data.length());
    328         System.out.println("Data:" + data);
    329         System.out.println("单次请求耗时ms:" + (System.currentTimeMillis() - startPer));
    330         System.out.println("查询总耗时ms:" + (System.currentTimeMillis() - start));
    331     }
    332 }

    这里用到的jar包:

    <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
      <version>4.5.2</version>
    </dependency>
  • 相关阅读:
    七层网络模型
    nginx配置本地https
    kong结合consul
    kong添加upstream
    1.创建spring cloud父工程和子模块
    idea自动生成spring实体
    php的json_encode()之后float类型丢失精度
    windows下wnmp配置
    Call to undefined function imageftbbox()
    介绍一款比较好用的画图工具--PlantUml
  • 原文地址:https://www.cnblogs.com/lxn0216/p/9262835.html
Copyright © 2011-2022 走看看