2019独角兽企业重金招聘Python工程师标准>>>

package com.XXXXXX.XXXXXXX.utils;import java.io.InputStream;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.ProtocolException;
import org.apache.http.client.RedirectStrategy;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
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.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
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.PoolingHttpClientConnectionManager;
import org.apache.http.protocol.HttpContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** http 连接工具类* @ClassName: HttpClientUtil* @date 2017年9月16日 上午11:46:45*/
public class HttpClientUtil {private static final Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);private static PoolingHttpClientConnectionManager connectionManager;private static final Timer connectionManagerTimer = new Timer("SimpleRouteFilter.connectionManagerTimer", true);static{connectionManager = newConnectionManager();connectionManagerTimer.schedule(new TimerTask() {public void run() {if (connectionManager == null) {return;}connectionManager.closeExpiredConnections(); //释放掉过期的链接}}, 30000, 5000);}/*** 创建连接池* @CreateTime: 2017年9月16日 下午12:01:54* @UpdateTime: 2017年9月16日 下午12:01:54* @return*/private static PoolingHttpClientConnectionManager newConnectionManager(){try{final SSLContext sslContext = SSLContext.getInstance("SSL");sslContext.init(null, new TrustManager[] { new X509TrustManager() {public void checkClientTrusted(X509Certificate[] x509Certificates,String s) throws CertificateException {}public void checkServerTrusted(X509Certificate[] x509Certificates,String s) throws CertificateException {}public X509Certificate[] getAcceptedIssuers() {return null;}} }, new SecureRandom());RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.<ConnectionSocketFactory> create().register("http", PlainConnectionSocketFactory.INSTANCE).register("https", new SSLConnectionSocketFactory(sslContext));final Registry<ConnectionSocketFactory> registry = registryBuilder.build();connectionManager = new PoolingHttpClientConnectionManager(registry);/*** maxTotal 与 MaxPerRoute 解释:*  路由的默认最大连接(该值默认为2)限制数量实际使用DefaultMaxPerRoute并非MaxTotal* 设置过小无法支持大并发(ConnectionPoolTimeoutException: Timeout waiting for connection from pool)* 路由是对maxTotal的细分例如:MaxtTotal=400 DefaultMaxPerRoute=200* 而我只连接到http://sishuok.com时,到这个主机的并发最多只有200;而不是400;* 而我连接到http://sishuok.com 和 http://qq.com时,到每个主机的并发最多只有200;即加起来是400(但不能超过400)*/connectionManager.setMaxTotal(400);//设置整个连接池最大连接数connectionManager.setDefaultMaxPerRoute(200);//每个主机的并发最多只有200//this.connectionManager.setValidateAfterInactivity(ms);return connectionManager;}catch (Exception e) {throw new RuntimeException(e);}}/*** 创建连接* @CreateTime: 2017年9月16日 下午12:02:14* @UpdateTime: 2017年9月16日 下午12:02:14* @param timeOut* @return*/private static CloseableHttpClient  getHttpClient(int timeOut){final RequestConfig requestConfig = RequestConfig.custom()//.setSocketTimeout(PropertyPlaceholder.getInt("proxyClient.socket_timeout"))//请求获取数据的超时时间.setSocketTimeout(timeOut)//请求获取数据的超时时间.setConnectTimeout(200000)//设置连接超时时间,单位毫秒。.setConnectionRequestTimeout(3000000)//设置从连接池获取连接超时时间、如果不设置,默认为connection_timeout因此一定要设置而且不能太大 .setCookieSpec(CookieSpecs.IGNORE_COOKIES).build();HttpClientBuilder httpClientBuilder = HttpClients.custom();return httpClientBuilder.setConnectionManager(connectionManager).setDefaultRequestConfig(requestConfig).setRetryHandler(new DefaultHttpRequestRetryHandler(0, false))//不进行重试.setRedirectStrategy(new RedirectStrategy() { //重定向问题public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context)throws ProtocolException {return false;}public HttpUriRequest getRedirect(HttpRequest request, HttpResponse response, HttpContext context)throws ProtocolException {return null;}}).build();}public static String httpRequest(String requestUrl,Map<String, String> params, String requestbody) {String result = "";CloseableHttpClient httpclient = null;try {httpclient = getHttpClient(100000000);//默认超时时间为30sif(null != params && params.size() > 0){requestUrl = requestUrl + "?";for(String key : params.keySet()){requestUrl = requestUrl + key + "=" + params.get(key) + "&";}}logger.info("httpCinet 发送请求地址:{}",requestUrl);HttpPost httpPost = new HttpPost(requestUrl);//设置请求的bodyif(StringUtils.isNotBlank(requestbody)){httpPost.setEntity(new StringEntity(requestbody, "UTF-8"));}long startTime = System.currentTimeMillis();CloseableHttpResponse response = httpclient.execute(httpPost);//httpPost.releaseConnection();logger.info("httpCinet 发送请求地址:{},共花费了:{} ms",requestUrl,(System.currentTimeMillis()-startTime));try {InputStream in=response.getEntity().getContent();result = IOUtils.toString(in);//httpPost.releaseConnection();in.close();//bufferedReader.close();作用就是将用完的连接释放,下次请求可以复用} finally {//这里特别注意的是,如果不使用in.close();而仅仅使用response.close();结果就是连接会被关闭,并且不能被复用,这样就失去了采用连接池的意义response.close();  }} catch (Exception e) {logger.error(e.getMessage(),e);}return result;}
}

转载于:https://my.oschina.net/u/2277088/blog/1621346

HttpClient Util 工具相关推荐

  1. HttpClient Utils工具类的编写方法分享

    转自: HttpClient Utils工具类的编写方法分享 HttpClient简介: HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功 ...

  2. 不要再自己封装各种Util工具类了,这款神仙级框架你值得拥有!

    点击关注公众号,Java干货及时送达 来源:ryanc.cc/archives/hutool-java-tools-lib 作者:Ryan Wang 简介 Hutool 谐音 "糊涂&quo ...

  3. 不要再封装各种Util工具类了,这个神级框架值得拥有!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! Hutool 谐音 "糊涂",寓意追求 ...

  4. 封装时间转换工具类_推荐一款封装各种Util工具类,这款神仙级框架你值得拥有!...

    点击上方 "Java指南者"关注, 星标或置顶一起成长 免费送 1024GB 精品学习资源 来源:ryanc.cc/archives/hutool-java-tools-lib 简 ...

  5. 还在封装各种 Util 工具类?这个神级框架帮你解决所有问题!

    来源 | 网络 Hutool 谐音 "糊涂",寓意追求 "万事都作糊涂观,无所谓失,无所谓得" 的境界. Hutool 是一个 Java 工具包,也只是一个工具 ...

  6. 加密封装 怎么把_不要再封装各种Util工具类了,这个神级框架值得拥有!

    Hutool 谐音 "糊涂",寓意追求 "万事都作糊涂观,无所谓失,无所谓得" 的境界. Hutool 是一个 Java 工具包,也只是一个工具包,它帮助我们简 ...

  7. httpurlconnection 封装_不要再封装各种Util工具类了,看看这个框架

    不要再封装各种Util工具类了,看看这个框架 Hutool 谐音 "糊涂",寓意追求 "万事都作糊涂观,无所谓失,无所谓得" 的境界.    Hutool 是一 ...

  8. JAVA——保持cookie登录状态的HttpClient封装工具类

    在日常开发中,我们经常需要通过http协议去调用网络内容,虽然java自身提供了net相关工具包,但是其灵活性和功能总是不如人意,于是有人专门搞出一个httpclient类库,来方便进行Http操作. ...

  9. JAVA——HttpClient封装工具类

    在日常开发中,我们经常需要通过http协议去调用网络内容,虽然java自身提供了net相关工具包,但是其灵活性和功能总是不如人意,于是有人专门搞出一个httpclient类库,来方便进行Http操作. ...

  10. java httpclient put_[工具类-HttpClientUtils]HttpClient之GET PUT DELETE POST

    图片来自网络 发送http请求: get put delete post package com.zefun.common.utils; import java.io.IOException; imp ...

最新文章

  1. 小团队 vs 大团队
  2. CSS之position
  3. 开课吧java_开课吧javaee企业级开发工程师 十期
  4. 前端学习(703):white小练习
  5. 当下大部分互联网创业公司为什么都愿意采用增量模型来做开发?
  6. 混凝土静力受压弹性模量试验计算公式_【小马建考干货】天天送检,你知道混凝土试块检测哪些性能标指吗?...
  7. html 5新增技术,HTML5新增标签
  8. centos普通用户和root用户之间相互切换
  9. 时间进度表html,网页的设计进度表.doc
  10. h5项目解决苹果手机iOS系统字体放大问题
  11. 剑指offer 09、30:栈与队列
  12. 使用node.js构建一个web服务器(适合自学)
  13. 085400计算机技术专业怎么参加公考,2021年东南大学电子信息(085400)计算机技术_考研专业目录_考试科目_考试范围 - 学途吧...
  14. inflate方法的用法
  15. 千与千寻主题曲beep函数版
  16. VMware-KVM安装
  17. 删除360天擎(企业版)---不知道密码情况下
  18. 计算机网络管理员4级考试题,2015计算机软考网络管理员试题及答案(三)
  19. iOS开发中使用UILabel设置字体的相关技巧小结
  20. 如何在工作中保持专注力

热门文章

  1. jQuery的几个例子流程讲解
  2. sencha touch 2.0 学习记录
  3. 基于AE+C#实现在TOCControl中实现指定图层删除
  4. KMP模式匹配算法——C++
  5. seaborn 绘图sns.relplot
  6. ArcGIS 道路线数据处理与拓扑操作
  7. 【读书】如何阅读一本书
  8. 项目:聊天室思路(linux下实现,语言:C/C++)
  9. 关系抽取综述及相关顶会论文介绍
  10. c++提取map key_写 React / Vue 项目时为什么要在列表组件中写 key,其作用是什么?...