package me.ddkj.utils.http; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.SocketTimeoutException; import java.nio.charset.Charset; import java.nio.charset.UnsupportedCharsetException; import java.security.GeneralSecurityException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicInteger; import java.util.Set; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLException; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocket; import me.ddkj.utils.util.NumberUtil; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.config.RequestConfig.Builder; import org.apache.http.client.entity.UrlEncodedFormEntity; 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.conn.ConnectTimeoutException; import org.apache.http.conn.routing.HttpRoute; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.LayeredConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLContextBuilder; import org.apache.http.conn.ssl.SSLContexts; import org.apache.http.conn.ssl.TrustSelfSignedStrategy; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.conn.ssl.X509HostnameVerifier; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.entity.mime.HttpMultipartMode; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.message.BasicNameValuePair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; /** * 依赖的jar包有:commons-lang-2.6.jar、httpclient-4.3.2.jar、httpcore-4.3.1.jar、commons-io-2.4.jar * @author zhaoyb * */ public class HttpClientUtils { public static final int connTimeout=2000; public static final int readTimeout=10000; public static final String charset="UTF-8"; public static final String JSON_TYPE = "application/json"; private static final String BASE_URL = "https://console.tim.qq.com/v4"; private static HttpClient client = null; public static HttpClient getHttpClient(){ return client; } private static Logger logger = LoggerFactory.getLogger(HttpClientUtils.class); static { SSLConnectionSocketFactory sslsf = SSLConnectionSocketFactory.getSocketFactory(); Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("https", sslsf) .build(); PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry); HttpHost localhost = new HttpHost(BASE_URL); // 将最大连接数增加到200 cm.setMaxTotal(200); // 将每个路由基础的连接增加到20 cm.setDefaultMaxPerRoute(20); // 将目标主机的最大连接数增加到50 cm.setMaxPerRoute(new HttpRoute(localhost), 50); client = HttpClients.custom().setConnectionManager(cm).build(); } public static String postParameters(String url, String parameterStr) throws ConnectTimeoutException, SocketTimeoutException, Exception{ return post(url,parameterStr,"application/x-www-form-urlencoded",charset,connTimeout,readTimeout); } public static String postParameters(String url, String parameterStr,String charset, Integer connTimeout, Integer readTimeout) throws ConnectTimeoutException, SocketTimeoutException, Exception{ return post(url,parameterStr,"application/x-www-form-urlencoded",charset,connTimeout,readTimeout); } public static void postFile(String url, Map<String, String> files, Map<String, String> params) throws ConnectTimeoutException, SocketTimeoutException, Exception{ postFile(url, params, files, null, connTimeout,readTimeout); } public static String postParameters(String url, Map<String, String> params) throws ConnectTimeoutException, SocketTimeoutException, Exception { return postForm(url, params, null, connTimeout, readTimeout); } public static String postParameters(String url, Map<String, String> params, Integer connTimeout,Integer readTimeout) throws ConnectTimeoutException, SocketTimeoutException, Exception { return postForm(url, params, null, connTimeout, readTimeout); } public static String get(String url) throws Exception { return get(url, charset, null, null); } public static String get(String url, String charset) throws Exception { return get(url, charset, connTimeout, readTimeout); } //下载文件 public static boolean get(String url, File file) throws Exception { return get(url, charset, connTimeout, readTimeout, file); } /** * 发�?�?�� Post 请求, 使用指定的字符集编码. * * @param url * @param body RequestBody * @param mimeType 例如 application/xml "application/x-www-form-urlencoded" a=1&b=2&c=3 * @param charset 编码 * @param connTimeout 建立链接超时时间,毫秒. * @param readTimeout 响应超时时间,毫秒. * @return ResponseBody, 使用指定的字符集编码. * @throws ConnectTimeoutException 建立链接超时异常 * @throws SocketTimeoutException 响应超时 * @throws Exception */ public static String post(String url, String body, String mimeType,String charset, Integer connTimeout, Integer readTimeout) throws ConnectTimeoutException, SocketTimeoutException, Exception { HttpClient client = null; HttpPost post = new HttpPost(url); String result = ""; try { if (StringUtils.isNotEmpty(body)) { HttpEntity entity = new StringEntity(body, ContentType.create(mimeType, charset)); post.setEntity(entity); } // 设置参数 Builder customReqConf = RequestConfig.custom(); if (connTimeout != null) { customReqConf.setConnectTimeout(connTimeout); } if (readTimeout != null) { customReqConf.setSocketTimeout(readTimeout); } post.setConfig(customReqConf.build()); HttpResponse res; /* if (url.startsWith("https")) { // 执行 Https 请求. client = createSSLInsecureClient(); res = client.execute(post); } else { // 执行 Http 请求. }*/ client = HttpClientUtils.client; res = client.execute(post); result = IOUtils.toString(res.getEntity().getContent(), charset); } finally { post.releaseConnection(); /* if (url.startsWith("https") && client != null&& client instanceof CloseableHttpClient) { ((CloseableHttpClient) client).close(); }*/ } return result; } /** * 提交form表单 * * @param url * @param params * @param connTimeout * @param readTimeout * @return * @throws ConnectTimeoutException * @throws SocketTimeoutException * @throws Exception */ public static String postForm(String url, Map<String, String> params, Map<String, String> headers, Integer connTimeout,Integer readTimeout) throws ConnectTimeoutException, SocketTimeoutException, Exception { HttpClient client = null; HttpPost post = new HttpPost(url); try { if (params != null && !params.isEmpty()) { List<NameValuePair> formParams = new ArrayList<org.apache.http.NameValuePair>(); Set<Entry<String, String>> entrySet = params.entrySet(); for (Entry<String, String> entry : entrySet) { formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); } UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, Consts.UTF_8); post.setEntity(entity); } if (headers != null && !headers.isEmpty()) { for (Entry<String, String> entry : headers.entrySet()) { post.addHeader(entry.getKey(), entry.getValue()); } } // 设置参数 Builder customReqConf = RequestConfig.custom(); if (connTimeout != null) { customReqConf.setConnectTimeout(connTimeout); } if (readTimeout != null) { customReqConf.setSocketTimeout(readTimeout); } post.setConfig(customReqConf.build()); HttpResponse res = null; if (url.startsWith("https")) { // 执行 Https 请求. client = createSSLInsecureClient(); res = client.execute(post); } else { // 执行 Http 请求. client = HttpClientUtils.client; res = client.execute(post); } return IOUtils.toString(res.getEntity().getContent(), "UTF-8"); } finally { post.releaseConnection(); if (url.startsWith("https") && client != null && client instanceof CloseableHttpClient) { ((CloseableHttpClient) client).close(); } } } public static String postJson(String url ,JSONArray jsonContent){ HttpClient client = null; HttpPost post = new HttpPost(url); Builder customReqConf = RequestConfig.custom(); try { customReqConf.setConnectTimeout(connTimeout); customReqConf.setSocketTimeout(readTimeout); post.setConfig(customReqConf.build()); StringEntity entity = new StringEntity(jsonContent.toJSONString(),"UTF-8");//解决中文乱码问题 entity.setContentEncoding("UTF-8"); entity.setContentType("application/json"); post.setEntity(entity); client = HttpClientUtils.client; HttpResponse result = client.execute(post); return IOUtils.toString(result.getEntity().getContent(), "UTF-8"); } catch (Exception e) { e.printStackTrace(); }finally { post.releaseConnection(); } return null; } /** * * @param url 请求的url * @param params 请求的参�?如文件名 * @param file 上传的文�? * @param headers * @param connTimeout * @param readTimeout * @throws ConnectTimeoutException * @throws SocketTimeoutException * @throws Exception */ public static void postFile(String url, Map<String, String> params, Map<String, String> files, Map<String, String> headers, Integer connTimeout,Integer readTimeout) throws ConnectTimeoutException, SocketTimeoutException, Exception { HttpClient client = null; HttpPost post = new HttpPost(url); // HttpGet post = new HttpGet(url); MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create(); multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); multipartEntityBuilder.setCharset(Charset.forName("utf-8")); try { if (params != null && !params.isEmpty()) { Set<Entry<String, String>> entrySet = params.entrySet(); for (Entry<String, String> entry : entrySet) { // System.out.println(entry.getKey() + entry.getValue()); multipartEntityBuilder.addTextBody(entry.getKey(), entry.getValue()); } } if (files != null) { Iterator<Map.Entry<String, String>> iterator = files.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, String> entry = (Map.Entry<String, String>) iterator.next(); String path = entry.getValue(); // System.out.println(entry.getKey() + entry.getValue()); if ("".equals(path) || path == null) continue; File file = new File(entry.getValue()); multipartEntityBuilder.addBinaryBody(entry.getKey(), file); } } HttpEntity httpEntity = multipartEntityBuilder.build(); post.setEntity(httpEntity); // System.out.println(post); if (headers != null && !headers.isEmpty()) { for (Entry<String, String> entry : headers.entrySet()) { post.addHeader(entry.getKey(), entry.getValue()); } } // 设置参数 Builder customReqConf = RequestConfig.custom(); if (connTimeout != null) { customReqConf.setConnectTimeout(connTimeout); } if (readTimeout != null) { customReqConf.setSocketTimeout(readTimeout); } post.setConfig(customReqConf.build()); HttpResponse res = null; if (url.startsWith("https")) { // 执行 Https 请求. client = createSSLInsecureClient(); res = client.execute(post); } else { // 执行 Http 请求. client = HttpClientUtils.client; System.out.println(" kkk"); res = client.execute(post); } // System.out.println(" " + res.getStatusLine().getStatusCode()); logger.debug(" " + res.getStatusLine().getStatusCode()); } finally { post.releaseConnection(); if (url.startsWith("https") && client != null && client instanceof CloseableHttpClient) { ((CloseableHttpClient) client).close(); } } } /** * 发�?�?�� GET 请求 * * @param url * @param charset * @param connTimeout 建立链接超时时间,毫秒. * @param readTimeout 响应超时时间,毫秒. * @return * @throws ConnectTimeoutException 建立链接超时 * @throws SocketTimeoutException 响应超时 * @throws Exception */ public static String get(String url, String charset, Integer connTimeout,Integer readTimeout) throws ConnectTimeoutException,SocketTimeoutException, Exception { HttpClient client = null; HttpGet get = new HttpGet(url); String result = ""; try { // 设置参数 Builder customReqConf = RequestConfig.custom(); if (connTimeout != null) { customReqConf.setConnectTimeout(connTimeout); } if (readTimeout != null) { customReqConf.setSocketTimeout(readTimeout); } get.setConfig(customReqConf.build()); HttpResponse res = null; if (url.startsWith("https")) { // 执行 Https 请求. client = createSSLInsecureClient(); res = client.execute(get); } else { // 执行 Http 请求. client = HttpClientUtils.client; res = client.execute(get); } result = IOUtils.toString(res.getEntity().getContent(), charset); } finally { get.releaseConnection(); if (url.startsWith("https") && client != null && client instanceof CloseableHttpClient) { ((CloseableHttpClient) client).close(); } } return result; } /** * �?response 里获�?charset * * @param ressponse * @return */ @SuppressWarnings("unused") private static String getCharsetFromResponse(HttpResponse ressponse) { // Content-Type:text/html; charset=GBK if (ressponse.getEntity() != null && ressponse.getEntity().getContentType() != null && ressponse.getEntity().getContentType().getValue() != null) { String contentType = ressponse.getEntity().getContentType().getValue(); if (contentType.contains("charset=")) { return contentType.substring(contentType.indexOf("charset=") + 8); } } return null; } /** * 创建 SSL连接 * @return * @throws GeneralSecurityException */ private static CloseableHttpClient createSSLInsecureClient() throws GeneralSecurityException { try { SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { public boolean isTrusted(X509Certificate[] chain,String authType) throws CertificateException { return true; } }).build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() { @Override public boolean verify(String arg0, SSLSession arg1) { return true; } @Override public void verify(String host, SSLSocket ssl) throws IOException { } @Override public void verify(String host, X509Certificate cert) throws SSLException { } @Override public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException { } }); return HttpClients.custom().setSSLSocketFactory(sslsf).build(); } catch (GeneralSecurityException e) { throw e; } } //下载文件 public static boolean get(String url, String charset, Integer connTimeout,Integer readTimeout, File file) { HttpClient client = null; OutputStream out = null; HttpGet get = new HttpGet(url); try { // 设置参数 Builder customReqConf = RequestConfig.custom(); if (connTimeout != null) { customReqConf.setConnectTimeout(connTimeout); } if (readTimeout != null) { customReqConf.setSocketTimeout(readTimeout); } get.setConfig(customReqConf.build()); HttpResponse res = null; if (url.startsWith("https")) { // 执行 Https 请求. client = createSSLInsecureClient(); res = client.execute(get); } else { // 执行 Http 请求. client = HttpClientUtils.client; res = client.execute(get); } logger.debug("res hhh" + res); if(res.getStatusLine().getStatusCode() == 404) { logger.debug("404 hhh"); return false; } out = new FileOutputStream(file); InputStream instream = res.getEntity().getContent(); byte b[] = new byte[1024]; int j = 0; while( (j = instream.read(b))!=-1){ out.write(b,0,j); } out.flush(); out.close(); } catch(Exception e){ logger.debug("555"); logger.error(" " + e); return false; }finally { get.releaseConnection(); if (url.startsWith("https") && client != null && client instanceof CloseableHttpClient) { try { ((CloseableHttpClient) client).close(); } catch (IOException e) { // TODO Auto-generated catch block logger.equals(e); } } if(out != null) { try { out.flush(); } catch (Exception e) { // TODO Auto-generated catch block } try { out.close(); } catch (Exception e) { // TODO Auto-generated catch block } } } return true; } private static AtomicInteger cnt = new AtomicInteger(0); private static AtomicInteger time = new AtomicInteger(0); public static void main(String []args) { String url = "https://console.tim.qq.com/v4/group_open_http_svc/get_group_member_info?usersig=eJxlzl1rgzAUBuB7f0XwdmMkjYntoBel3UeIbpO6wnYTrIk21qrE2FnK-vuoK0zYuX3e95xzdgAAbhys75I0rbvKCntqlAvugQvd2z9sGi1FYgU28h*qvtFGiSSzygxI0NSDcBzRUlVWZ-oaQCNq5V4M63-lUkR06o-brc4HDB-elyxa0ZJ9BWgdR8eO71Ivfmp5YjxaJGSxgM-9qf8waZDt6nIZsTwISY62eypfGYuotptD5zVhsCrKT-7C8WN*0xPJZ9vizZuPTlp9UNeHfH8GMcZkpEdlWl1XQ2ACEUETDC-jOt-OD7iVWu8_&identifier=1&sdkappid=1400016870"; JSONObject jb = new JSONObject(); jb.put("GroupId", "332"); for(int i=0;i<50;i++){ new Thread(()->{ for(int j = 0;j<5;j++){ StringBuilder sb = new StringBuilder(); sb.append(url); sb.append("&random=").append(NumberUtil.getRandom()).append("&contenttype=json"); try { long st = System.currentTimeMillis(); String result = HttpClientUtils.post(url, jb.toJSONString(), HttpClientUtils.JSON_TYPE, "UTF-8", 5000, 5000); // System.out.println(sb); long et = System.currentTimeMillis(); cnt.set(cnt.get()+1); time.set(time.get()+(int)(et-st)); System.out.println(cnt.get()+"访问耗时:"+(et-st)+"毫秒:"+Thread.currentThread().getName()); System.out.println(time.get()/cnt.get()); } catch (Exception e) { e.printStackTrace(); } } },"thread-"+i).start(); } } }