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>