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>
原文地址:https://www.cnblogs.com/lxn0216/p/9262835.html