Java HTTP工具类:使用HttpUtils进行网络请求-程序员宅基地

技术标签: java httputils  

package iih.custom.common.util;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.nio.charset.Charset;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import java.util.Set;

import org.apache.http.Header;

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.HttpRequestRetryHandler;

import org.apache.http.client.config.RequestConfig;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.client.methods.HttpRequestBase;

import org.apache.http.config.Registry;

import org.apache.http.config.RegistryBuilder;

import org.apache.http.conn.routing.HttpRoute;

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.HttpClients;

import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.protocol.HttpContext;

import org.apache.http.util.EntityUtils;

import iih.custom.common.log.CustomBizLogger;

/**

* httpclient 工具类

* @author tian.hq 2019.05.31

*

*/

public class HttpUtils {

private static final int timeOut = 100 * 1000;

/**

* 创建httpClient 对象

* @param ip

* @param port

* @return

*/

public static HttpClient getHttpClient(String ip,Integer port) {

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(getDefaultRegistry());

// 将最大连接数增加

cm.setMaxTotal(200);

cm.setDefaultMaxPerRoute(200);

HttpHost httpHost = new HttpHost(ip, port);

// 将目标主机的最大连接数增加

cm.setMaxPerRoute(new HttpRoute(httpHost), 200);

HttpClient httpClient = HttpClients.custom().setConnectionManager(cm)

// 设置重试次数

.setRetryHandler(new HttpRequestRetryHandler() {

@Override

public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {

if (executionCount > 3) {

CustomBizLogger.info("Maximum tries reached for client http pool");

return false;

}

// 服务器端没有返回的情况,一般是连接池里面的连接失效,需要重试

if (exception instanceof org.apache.http.NoHttpResponseException) {

CustomBizLogger.info("No response from server on " + executionCount + " call");

return true;

}

if (exception instanceof java.net.SocketException) {

// 客户端主动关闭连接的情况,一般是连接池里面的连接失效,需要重试

if (exception.getMessage().indexOf("Connection reset") >= 0) {

CustomBizLogger.info("java.net.SocketException Connection reset " + executionCount + " call");

return true;

}

}

if (exception instanceof java.net.SocketTimeoutException) {

// 连接或者响应超时,需要重试

CustomBizLogger.info("java.net.SocketTimeoutException: Read timed out " + executionCount + " call");

return true;

}

return false;

}

})

.build();

return httpClient;

}

private static Registry getDefaultRegistry() {

return RegistryBuilder.create()

.register("http", PlainConnectionSocketFactory.getSocketFactory())

.register("https", SSLConnectionSocketFactory.getSocketFactory())

.build();

}

/**

* httpClient 发送post请求

* @param client

* @param url

* @param params

* @return 返回

* @throws Exception

*/

public static String sendPost(HttpClient client,String url,Map params) throws Exception {

HttpPost httppost = new HttpPost(url);

config(httppost);

setPostParams(httppost, params);

HttpResponse response = null;

try {

response = client.execute(httppost);

HttpEntity entity = response.getEntity();

String result = EntityUtils.toString(entity, "utf-8");

EntityUtils.consume(entity);

return result;

} catch (Exception e) {

CustomBizLogger.error("httpClient 发送post请求异常",e);

throw e;

}

}

public static String sendPost(HttpClient client,String url,String data) throws Exception {

HttpPost httppost = new HttpPost(url);

config(httppost);

StringEntity stringEntity = new StringEntity(data,Charset.forName("UTF-8"));

httppost.setEntity(stringEntity);

HttpResponse response = null;

try {

response = client.execute(httppost);

HttpEntity entity = response.getEntity();

String result = EntityUtils.toString(entity, "UTF-8");

EntityUtils.consume(entity);

return result;

} catch (Exception e) {

CustomBizLogger.error("httpClient 发送post请求异常",e);

throw e;

}

}

/***

* 发送post 请求 ,附带header信息

* @param client

* @param url

* @param data

* @param headers

* @return

* @throws Exception

*/

public static String sendPost(HttpClient client,String url,String data,Map headers) throws Exception {

HttpPost httppost = new HttpPost(url);

config(httppost);

fillHttpPostHeader(httppost,headers);

StringEntity stringEntity = new StringEntity(data,Charset.forName("UTF-8"));

httppost.setEntity(stringEntity);

HttpResponse response = null;

try {

response = client.execute(httppost);

HttpEntity entity = response.getEntity();

String result = EntityUtils.toString(entity, "UTF-8");

EntityUtils.consume(entity);

return result;

} catch (Exception e) {

CustomBizLogger.error("httpClient 发送post请求异常",e);

throw e;

}

}

private static void setPostParams(HttpPost httpost, Map params) {

List nvps = new ArrayList();

Set keySet = params.keySet();

for (String key : keySet) {

nvps.add(new BasicNameValuePair(key, params.get(key).toString()));

}

try {

httpost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

CustomBizLogger.error("设置http post 参数异常",e);

}

}

private static void config(HttpRequestBase httpRequestBase) {

// 配置请求的超时设置

RequestConfig requestConfig = RequestConfig.custom()

.setConnectionRequestTimeout(timeOut)

.setConnectTimeout(timeOut).setSocketTimeout(timeOut).build();

httpRequestBase.setConfig(requestConfig);

}

/**

* 为HttpPost添加header信息

* @param post

* @param headers

*/

private static void fillHttpPostHeader(HttpPost post,Map headers){

if(headers == null){

return ;

}

for(String key:headers.keySet()){

post.addHeader(key, headers.get(key));

}

}

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35749440/article/details/114204288

智能推荐

MATLAB入门学习记录(一) 常用函数记录_matlab入门预习记录-程序员宅基地

文章浏览阅读677次。matlab自学记录(一) 最最最基础的函数和简单示例1.常量(特殊变量)ans - MATLAB中运行结果的默认变量名(命令窗口中运算,系统会主动把结果赋值给ans变量)pi - 圆周率Πeps - 计算机中的最小数flops - 浮点运算数inf - 无穷大,如1/0NaN - 不定值,如0/0,∞/∞,0*∞i/j - 虚数单位nargin 函数输入变量数目narout 函数输出变量数目realmax 最大的可用正实数realmin 最小的可用正实数赋_matlab入门预习记录

数据结构与算法详解(含算法分析、动图图解、Java代码实现、注释解析)-程序员宅基地

文章浏览阅读804次,点赞5次,收藏5次。但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!数据结构是算法的基础, 换言之,想要学好算法,需要把数据结构学到位。程序 = 数据结构 + 算法。常用数据结构与算法实现。小编整理不易,对这份。

南京大学计算机 吴迪,吴迪-程序员宅基地

文章浏览阅读402次。2014[66]Rectifying characteristics of a Fe:SrTiO3/Nb:SrTiO3homojunctionXiangbiao Qiu, Xiaoyu Zhou, Aidong Li, Zhengbin Gu*,Di Wu*Superlattices and Microstructures75, 72 (2014).[65]Memristive behaviors..._wu di nanjing university, state key laboratory for novel software technology

VS2015企业版专业版密钥_visual studio 2015企业版密钥-程序员宅基地

文章浏览阅读1.5w次,点赞17次,收藏18次。亲测可用,有需要的可以mark一下!专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV_visual studio 2015企业版密钥

python中.py和.pyw文件的区别_python. pyw-程序员宅基地

文章浏览阅读589次。 严格来说,它们之间的不同就只有一个:视窗运行它们的时候调用不同的执行档案。视窗用 python.exe 运行 .py ,用 pythonw.exe 运行 .pyw 。这纯粹是因为安装视窗版 Python 时,扩展名 .py 自动被登记为用 python.exe 运行的文件,而 .pyw 则被登记为用 pythonw.exe 运行。.py 和 .pyw 之间的“其它差别”全都是 ..._python. pyw

DHCP的原理与配置_dhcp广播-程序员宅基地

文章浏览阅读1.3k次。DHCP服务是用来进行动态主机分配的,可以有效的避免了因手动设置IP地址所产生的错误,同时也避免了把-一个IP地址分配给多台工作站所造成的地址冲突。DHCP 提供了安全、可靠且简单的TCP/IP 网络设置,降低了配置IP地址的负担。_dhcp广播

随便推点

面向UE4新手----基于UE4的室内软装系统设计和实现思路_基于ue4的装修设计软件开发-程序员宅基地

文章浏览阅读7.4k次,点赞6次,收藏22次。由于一直有朋友在与我讨论关于UE4室内软装的系统设计问题,问题也都大同小异,正好类似项目有一些经验,因此在此分享给大家,希望能帮助更多UE4的新手和小团队。由于我本人是独立游戏开发者而非室内设计方向的,并且当初这个项目是基于VR的,本身需求更多一些,因此在此分享一个简化版的,通过传统键鼠操作的设计思路,抛砖引玉。后续可能还会继续更新更多相关的内容。_基于ue4的装修设计软件开发

汽车电子常用外围硬件电路设计_lf天线驱动电路-程序员宅基地

文章浏览阅读3.8k次,点赞6次,收藏160次。1)LIN BUS电路 (最大波特率20Kbits/s)2).低速CAN电路(最大波特率125Kbits/s)3)高速CAN BUS电路(波特率40K~1Mbits/s)4)TJA1043T。_lf天线驱动电路

交叉熵-程序员宅基地

文章浏览阅读1.4w次,点赞29次,收藏81次。 一.什么是交叉熵交叉熵是一个信息论中的概念,它原来是用来估算平均编码长度的。给定两个概率分布p和q,通过q来表示p的交叉熵为: 注意,交叉熵刻画的是两个概率分布之间的距离,或可以说它刻画的是通过概率分布q来表达概率分布p的困难程度,p代表正确答案,q代表的是预测值,交叉熵越小,两个概率的分布约接近。 那么,在神经网络中怎样把前向传播得到的结果也变成概率分布呢?..._交叉熵

贝叶斯神经网络(5)- 图像处理bayes-CNN_bayes-cnn数据分类-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏29次。一、无偏估计百度:无偏估计是用样本统计量来估计总体参数时的一种无偏推断。估计量的数学期望等于被估计参数的真实值,则称此此估计量为被估计参数的无偏估计,即具有无偏性,是一种用于评价估计量优良性的准则。无偏估计的意义是:在多次重复下,它们的平均数接近所估计的参数真值。无偏估计常被应用于测验分数统计中。二、计算图片的组成分布p(x)用途:如果我们知道的图片的分布p(x),我们就可以生成新的图片,判断异常..._bayes-cnn数据分类

linux下vim和bash配置文件_executed by bash(1) for non-login shells.-程序员宅基地

文章浏览阅读662次。1. ~/.vimrc"去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限set nocompatibleset autoread " 文件修改之后自动载入set completeopt=longest,menu " 自动完成set history=1000 "记录历史的行数set backspace=2 _executed by bash(1) for non-login shells.

Oracle RAC 到单机 OGG 配置测试_rac和单实例启动ogg区别-程序员宅基地

文章浏览阅读8.5k次,点赞2次,收藏12次。RAC OGG RAC到单机 ACFS OGG 创建ACFS fbo_ggs_Linux_x64_shiphome.zip RAC OGG 单实例Rac与单实例不同之处在于rac上的goldengate 需要安装在共享存储上asmca 创建ACFS chekpointtable add extract E_RAC,tranlog,threads 3 begin nowadd exttrail /ogg/install/dirdat/extlt/rac/lt,extract E_RAC add_rac和单实例启动ogg区别

推荐文章

热门文章

相关标签