Apache HttpComponents 工具类 [ HttpUtil ]
pom.xml
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.5</version>
</dependency>
HttpUtil.java
package com.app.core.util;
import com.google.common.base.Predicate;
import com.google.common.collect.Maps;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.client.utils.URLEncodedUtils;
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.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
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.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.ssl.TrustStrategy;
import org.apache.http.util.EntityUtils;
import javax.net.ssl.SSLContext;
import java.io.File;
import java.io.FileInputStream;
import java.nio.charset.StandardCharsets;
import java.security.KeyStore;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Log4j2
public class HttpUtil {
public static final ContentType TEXT_PLAIN = ContentType.create("text/plain", StandardCharsets.UTF_8);
/**
* HttpClient 连接池
*/
private static PoolingHttpClientConnectionManager cm = null;
static {
// 初始化连接池,可用于请求HTTP/HTTPS(信任所有证书)
cm = new PoolingHttpClientConnectionManager(getRegistry());
// 整个连接池最大连接数
cm.setMaxTotal(200);
// 每路由最大连接数,默认值是2
cm.setDefaultMaxPerRoute(5);
}
/**
* 发送 HTTP GET请求
* <p>不带请求参数和请求头</p>
*
* @param url 地址
* @return
* @throws Exception
*/
public static String httpGet(String url) throws Exception {
HttpGet httpGet = new HttpGet(url);
return doHttp(httpGet);
}
/**
* 发送 HTTP GET请求
* <p>带请求参数,不带请求头</p>
*
* @param url 地址
* @param params 参数
* @return
* @throws Exception
* @throws Exception
*/
public static String httpGet(String url, Map<String, Object> params) throws Exception {
// 转换请求参数
List<NameValuePair> pairs = covertParams2NVPS(params);
// 装载请求地址和参数
URIBuilder ub = new URIBuilder();
ub.setPath(url);
ub.setParameters(pairs);
HttpGet httpGet = new HttpGet(ub.build());
return doHttp(httpGet);
}
/**
* 发送 HTTP GET请求
* <p>带请求参数和请求头</p>
*
* @param url 地址
* @param headers 请求头
* @param params 参数
* @return
* @throws Exception
* @throws Exception
*/
public static String httpGet(String url, Map<String, Object> headers, Map<String, Object> params) throws Exception {
// 转换请求参数
List<NameValuePair> pairs = covertParams2NVPS(params);
// 装载请求地址和参数
URIBuilder ub = new URIBuilder();
ub.setPath(url);
ub.setParameters(pairs);
HttpGet httpGet = new HttpGet(ub.build());
// 设置请求头
for (Map.Entry<String, Object> param : headers.entrySet())
httpGet.addHeader(param.getKey(), String.valueOf(param.getValue()));
return doHttp(httpGet);
}
/**
* 发送 HTTP POST请求
* <p>不带请求参数和请求头</p>
*
* @param url 地址
* @return
* @throws Exception
*/
public static String httpPost(String url) throws Exception {
HttpPost httpPost = new HttpPost(url);
return doHttp(httpPost);
}
/**
* 发送 HTTP POST请求
* <p>带请求参数,不带请求头</p>
*
* @param url 地址
* @param params 参数
* @return
* @throws Exception
*/
public static String httpPost(String url, Map<String, Object> params) throws Exception {
// 转换请求参数
List<NameValuePair> pairs = covertParams2NVPS(params);
HttpPost httpPost = new HttpPost(url);
// 设置请求参数
httpPost.setEntity(new UrlEncodedFormEntity(pairs, StandardCharsets.UTF_8.name()));
return doHttp(httpPost);
}
/**
* 发送 HTTP POST请求
* <p>带请求参数和请求头</p>
*
* @param url 地址
* @param headers 请求头
* @param params 参数
* @return
* @throws Exception
*/
public static String httpPost(String url, Map<String, Object> headers, Map<String, Object> params) throws Exception {
// 转换请求参数
List<NameValuePair> pairs = covertParams2NVPS(params);
HttpPost httpPost = new HttpPost(url);
// 设置请求参数
httpPost.setEntity(new UrlEncodedFormEntity(pairs, StandardCharsets.UTF_8.name()));
// 设置请求头
for (Map.Entry<String, Object> param : headers.entrySet())
httpPost.addHeader(param.getKey(), String.valueOf(param.getValue()));
return doHttp(httpPost);
}
/**
* 发送HTTP POST/FORM请求
* <p>模拟表单文件上传,默认表单名称为“media”,无附加表单</p>
*
* @param url 请求地址
* @param pathName 模拟表单文件全路径名
* @return Http POST/FORM 请求结果
* @throws Exception IO流异常
*/
public static String httpPostForm(String url, String pathName) throws Exception {
return httpPostForm(url, "media", pathName, null);
}
/**
* 发送HTTP POST/FORM请求
* <p>模拟表单文件上传,默认表单名称为“media”,无附加表单</p>
*
* @param url 请求地址
* @param file 模拟表单文件
* @return Http POST/FORM 请求结果
* @throws Exception IO流异常
*/
public static String httpPostForm(String url, File file) throws Exception {
return httpPostForm(url, "media", file, null);
}
/**
* 发送 HTTP POST/FORM请求
* <p>模拟表单文件上传</p>
*
* @param url 请求地址
* @param name 模拟表单名称
* @param pathName 模拟表单文件路径
* @param map 文件上传表单之外的附加表单,新增永久视频素材API需要使用该字段
* @return Http POST/FORM 请求结果
* @throws Exception IO流异常
*/
public static String httpPostForm(String url, String name, String pathName, Map<String, Object> map) throws Exception {
File file = new File(pathName);
// 检查文件名是否合法,以及文件是否存在
if (!file.isFile() || !file.exists())
throw new Exception("HttpClient Post/Form模拟表单请求的文件名不合法或文件不存在");
return httpPostForm(url, name, file, map);
} /**
* 发送 HTTP POST/FORM请求
* <p>模拟表单文件上传</p>
*
* @param url 请求地址
* @param name 模拟表单名称
* @param file 模拟表单文件
* @param map 文件上传表单之外的附加表单,新增永久视频素材API需要使用该字段
* @return Http POST/FORM 请求结果
* @throws Exception IO流异常
*/
public static String httpPostForm(String url, String name, File file, Map<String, Object> map) throws Exception {
// 初始化请求链接
HttpPost httppost = new HttpPost(url);
// 组装模拟表单
FileBody body = new FileBody(file);
// 组装HTTP表单请求参数
MultipartEntityBuilder builder = MultipartEntityBuilder.create().addPart(name, body);
// 附加表单
if (MapUtils.isNotEmpty(map)) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (entry.getValue() == null)
continue;
builder.addTextBody(entry.getKey(), entry.getValue().toString(), TEXT_PLAIN);
}
}
// 构建HttpEntity
HttpEntity entity = builder.build();
// 设置请求参数
httppost.setEntity(entity);
return doHttp(httppost);
}
/**
* 发送 HTTP POST请求,参数格式JSON
* <p>请求参数是JSON格式,数据编码是UTF-8</p>
*
* @param url
* @param param
* @return
* @throws Exception
*/
public static String httpPostJson(String url, String param) throws Exception {
HttpPost httpPost = new HttpPost(url);
// 设置请求头
httpPost.addHeader("Content-Type", "application/json; charset=UTF-8");
// 设置请求参数
httpPost.setEntity(new StringEntity(param, StandardCharsets.UTF_8.name()));
return doHttp(httpPost);
}
/**
* 发送 HTTP POST请求,参数格式XML
* <p>请求参数是XML格式,数据编码是UTF-8</p>
*
* @param url
* @param param
* @return
* @throws Exception
*/
public static String httpPostXml(String url, String param) throws Exception {
HttpPost httpPost = new HttpPost(url);
// 设置请求头
httpPost.addHeader("Content-Type", "application/xml; charset=UTF-8");
// 设置请求参数
httpPost.setEntity(new StringEntity(param, StandardCharsets.UTF_8.name()));
return doHttp(httpPost);
}
/**
* 发送 HTTPS POST请求
* <p>使用指定的证书文件及密码,不带请求头信息</p>
*
* @param url
* @param param
* @param path
* @param password
* @return
* @throws Exception
* @throws Exception
*/
public static String httpsPost(String url, String param, String path, String password) throws Exception {
HttpPost httpPost = new HttpPost(url);
// 设置请求参数
httpPost.setEntity(new StringEntity(param, StandardCharsets.UTF_8.name()));
return doHttps(httpPost, path, password);
}
/**
* 发送 HTTPS POST请求
* <p>使用指定的证书文件及密码,请求头为“application/xml;charset=UTF-8”</p>
*
* @param url
* @param param
* @param path
* @param password
* @return
* @throws Exception
* @throws Exception
*/
public static String httpsPostXml(String url, String param, String path, String password) throws Exception {
HttpPost httpPost = new HttpPost(url);
// 设置请求头
httpPost.addHeader("Content-Type", "application/xml; charset=UTF-8");
// 设置请求参数
httpPost.setEntity(new StringEntity(param, StandardCharsets.UTF_8.name()));
return doHttps(httpPost, path, password);
}
/**
* 将Map键值对拼接成QueryString字符串,UTF-8编码
*
* @param params
* @return
* @throws Exception
*/
public static String getQueryStr(Map<String, Object> params) throws Exception {
return URLEncodedUtils.format(covertParams2NVPS(params), StandardCharsets.UTF_8.name());
}
/**
* 将JavaBean属性拼接成QueryString字符串,UTF-8编码
*
* @param bean
* @return
* @throws Exception
*/
public static String getQueryStr(Object bean) throws Exception {
// 将JavaBean转换为Map
Map<String, Object> map = PropertyUtils.describe(bean);
// 移除Map中键为“class”和值为空的项
map = Maps.filterEntries(map, new Predicate<Map.Entry<String, Object>>() {
public boolean apply(Map.Entry<String, Object> input) {
// 返回false表示排除该项
return !(input.getKey().equals("class") || input.getValue() == null);
}
});
return URLEncodedUtils.format(covertParams2NVPS(map), StandardCharsets.UTF_8.name());
}
/**
* 将表单字符串转换为JavaBean
*
* @param queryStr 表单字符串
* @param clazz {@link Class}待转换的JavaBean
* @return
* @throws Exception
*/
public static <T> T parseNVPS2Bean(String queryStr, Class<T> clazz) throws Exception {
// 将“表单字符串”形式的字符串解析成NameValuePair集合
List<NameValuePair> list = URLEncodedUtils.parse(queryStr, StandardCharsets.UTF_8);
Map<String, String> rsMap = new HashMap<String, String>();
// 将NameValuePair集合中的参数装载到Map中
for (NameValuePair nvp : list)
rsMap.put(nvp.getName(), nvp.getValue());
// 实例化JavaBean对象
T t = clazz.newInstance();
// 将Map键值对装载到JavaBean中
BeanUtils.populate(t, rsMap);
return t;
}
/**
* 转换请求参数,将Map键值对拼接成QueryString字符串
*
* @param params
* @return
*/
public static String covertParams2QueryStr(Map<String, Object> params) {
List<NameValuePair> pairs = covertParams2NVPS(params);
return URLEncodedUtils.format(pairs, StandardCharsets.UTF_8.name());
}
/**
* 转换请求参数
*
* @param params
* @return
*/
public static List<NameValuePair> covertParams2NVPS(Map<String, Object> params) {
List<NameValuePair> pairs = new ArrayList<NameValuePair>();
for (Map.Entry<String, Object> param : params.entrySet())
pairs.add(new BasicNameValuePair(param.getKey(), String.valueOf(param.getValue())));
return pairs;
}
/**
* 发送 HTTP 请求
*
* @param request
* @return
* @throws Exception
*/
private static String doHttp(HttpRequestBase request) throws Exception {
// 通过连接池获取连接对象
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
return doRequest(httpClient, request);
}
/**
* 发送 HTTPS 请求
* <p>使用指定的证书文件及密码</p>
*
* @param request
* @param path
* @param password
* @return
* @throws Exception
* @throws Exception
*/
private static String doHttps(HttpRequestBase request, String path, String password) throws Exception {
// 获取HTTPS SSL证书
SSLConnectionSocketFactory csf = getSSLFactory(path, password);
// 通过连接池获取连接对象
CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(csf).build();
return doRequest(httpClient, request);
}
/**
* 获取HTTPS SSL连接工厂
* <p>使用指定的证书文件及密码</p>
*
* @param path 证书全路径
* @param password 证书密码
* @return
* @throws Exception
* @throws Exception
*/
private static SSLConnectionSocketFactory getSSLFactory(String path, String password) throws Exception {
// 初始化证书,指定证书类型为“PKCS12”
KeyStore keyStore = KeyStore.getInstance("PKCS12");
// 读取指定路径的证书
FileInputStream input = new FileInputStream(new File(path));
try {
// 装载读取到的证书,并指定证书密码
keyStore.load(input, password.toCharArray());
} finally {
input.close();
}
// 获取HTTPS SSL证书连接上下文
SSLContext sslContext = SSLContexts.custom().loadKeyMaterial(keyStore, password.toCharArray()).build();
// 获取HTTPS连接工厂,指定TSL版本
SSLConnectionSocketFactory sslCsf = new SSLConnectionSocketFactory(sslContext, new String[]{"SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.2"}, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier());
return sslCsf;
}
/**
* 获取HTTPS SSL连接工厂
* <p>跳过证书校验,即信任所有证书</p>
*
* @return
* @throws Exception
*/
private static SSLConnectionSocketFactory getSSLFactory() throws Exception {
// 设置HTTPS SSL证书信息,跳过证书校验,即信任所有证书请求HTTPS
SSLContextBuilder sslBuilder = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return true;
}
});
// 获取HTTPS SSL证书连接上下文
SSLContext sslContext = sslBuilder.build();
// 获取HTTPS连接工厂
SSLConnectionSocketFactory sslCsf = new SSLConnectionSocketFactory(sslContext, new String[]{"SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.2"}, null, NoopHostnameVerifier.INSTANCE);
return sslCsf;
}
/**
* 获取 HTTPClient注册器
*
* @return
* @throws Exception
*/
private static Registry<ConnectionSocketFactory> getRegistry() {
Registry<ConnectionSocketFactory> registry = null;
try {
registry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", new PlainConnectionSocketFactory()).register("https", getSSLFactory()).build();
} catch (Exception e) {
log.error("获取 HTTPClient注册器失败", e);
}
return registry;
}
/**
* 处理Http/Https请求,并返回请求结果
* <p>注:默认请求编码方式 UTF-8</p>
*
* @param httpClient
* @param request
* @return
* @throws Exception
*/
private static String doRequest(CloseableHttpClient httpClient, HttpRequestBase request) throws Exception {
String result = null;
CloseableHttpResponse response = null;
try {
// 获取请求结果
response = httpClient.execute(request);
// 解析请求结果
HttpEntity entity = response.getEntity();
// 转换结果
result = EntityUtils.toString(entity, StandardCharsets.UTF_8.name());
// 关闭IO流
EntityUtils.consume(entity);
} finally {
if (null != response)
response.close();
}
return result;
}
}
Apache HttpComponents 工具类 [ HttpUtil ]的更多相关文章
- Apache Commons 工具类介绍及简单使用
转自:http://www.cnblogs.com/younggun/p/3247261.html Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下 ...
- Apache Commons 工具类简单使用
Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于 ...
- Apache Commons 工具类介绍及简单使用(转载)
原文链接 http://www.cnblogs.com/younggun/p/3247261.html Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动 ...
- Java:Apache Commons 工具类介绍及简单使用
Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. Commons简介 组件 功能介绍 commo ...
- linkin大话数据结构--apache commons工具类
Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动. 一.Commons BeanUtils 说明:针对Bean的一个工具集.由于Bean往往是有一堆ge ...
- Http请求工具类 httputil
package com.snowfigure.kits.net; import java.io.BufferedReader; import java.io.IOException; import j ...
- apache StringUtils 工具类
// org.apache.commons.lang3.StringUtils // 1.IsEmpty/IsBlank - checks if a String contains text 检查是否 ...
- apache ArrayUtils 工具类
org.apache.commons.lang3.ArrayUtils // 1.add():将给定的数据添加到指定的数组中,返回一个新的数组. int[] arr = { 1, 2, 3 }; in ...
- Apache POI 工具类 [ PoiUtil ]
pom.xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml ...
随机推荐
- 完全卸载之前8.0的Mysql,安装5.5mysql
完全卸载: https://blog.csdn.net/sxingming/article/details/52601250 安装mysql5.5: https://blog.csdn.net/fly ...
- session过期跳转到登陆页面并跳出iframe框架的两个方法
最近在做拦截器,判断用户登录后操作超时,失去权限然后要重新登录,但是用的iframe,返回的登陆页总是在框架中显示,我百度了下,总是只有其中一个方法,现在分享下两种解决方法,希望对你们有帮助: 方法一 ...
- js 验证图片
var selectedImg = e.target.files[0]; //获取图片 var isPic = /^(image\/bmp|image\/gif|image\/jpeg|image\/ ...
- Windows的SEH机理简要介绍
1.异常分类 一般来说,我们把Exception分为2类,一类是CPU产生的异常,我们称之为CPU异常(或者硬件异常).另一类为是通过调用RaiseException API产生的软件异常,我们称之为 ...
- python3-常用模块之os
os模块,os是和操作系统交互的模块 os.getcwd() :获取当前工作目录,即当前python脚本工作的目录路径,如果是命令行模式下,同样表示当前目录下 os.listdir(路径): 列出指定 ...
- 详解position定位与定位应用
定位一直是WEB标准应用中的难点,如果理不清楚定位那么可能应实现的效果实现不了,实现了的效果可能会走样.如果理清了定位的原理,那定位会让网页实现的更加完美. 定位的定义: 在CSS中关于 ...
- STL与泛型编程第一周作业
/* 题目: 给定一个 vector:v1 = [0, 0, 30, 20, 0, 0, 0, 0, 10, 0],希望通过not_equal_to 算法找到到不为零的元素,并复制到另一个 vecto ...
- c++类成员函数的重载和覆盖有什么区别
1.成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. 2.覆盖是指派生类函数覆盖基类函数,特征是: (1)不同 ...
- Thinkphp 加载更多
要实现的效果是这样的: 每次点击显示更多按钮,都会往下显示2条数据,直到后面没有数据了.. 数据表: articleList模板文件 <include file="./Applicat ...
- mysql高级教程(二)-----性能分析
MySQL常见瓶颈 1.cpu SQL中对大量数据进行比较.关联.排序.分组 2.IO a.实例内存满足不了缓存数据或排序等需要,导致产生大量物理 IO. b.查询执行效率低,扫描过多数据行. 3.锁 ...