
matrix.boot.common.utils.http.HttpClientUtil Maven / Gradle / Ivy
package matrix.boot.common.utils.http;
import com.alibaba.fastjson.JSONObject;
import matrix.boot.common.enums.HttpParamTypeEnum;
import matrix.boot.common.exception.ServiceException;
import matrix.boot.common.utils.BIOStreamUtil;
import matrix.boot.common.utils.StringUtil;
import matrix.boot.common.dto.HttpCertDto;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
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.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.DefaultHostnameVerifier;
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.HttpClients;
import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import java.nio.charset.StandardCharsets;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.util.Map;
/**
* http请求工具
* @author wangcheng
*/
public class HttpClientUtil {
/**
* get请求
* @param url 连接地址
* @param callBack 回调方法
* @return T
*/
public static T sendGet(String url, CallBack callBack) {
return sendGet(url, null, null, null, callBack);
}
/**
* get请求
* @param url 连接地址
* @param params 参数
* @param callBack 回调方法
* @return T
*/
public static T sendGet(String url, Map params, CallBack callBack) {
return sendGet(url, null, params, null, callBack);
}
/**
* get请求
* @param url 连接地址
* @param headers 请求头
* @param params 参数
* @param callBack 回调方法
* @return T
*/
public static T sendGet(String url, Map headers, Map params, CallBack callBack) {
return sendGet(url, headers, params, null, callBack);
}
/**
* get请求
* @param url 连接地址
* @param certDto 证书(https需要)
* @param callBack 回调方法
* @return T
*/
public static T sendGet(String url, HttpCertDto certDto, CallBack callBack) {
return sendGet(url, null, null, certDto, callBack);
}
/**
* post请求
* @param url 连接地址
* @param body 参数
* @param paramType 参数类型
* @param callBack 回调方法
* @return T
*/
public static T sendPost(String url, String body, HttpParamTypeEnum paramType, CallBack callBack) {
return sendPost(url, null, body, paramType, null, callBack);
}
/**
* post请求
* @param url 连接地址
* @param headers 请求头
* @param body 参数
* @param paramType 参数类型
* @param callBack 回调方法
* @return T
*/
public static T sendPost(String url, Map headers, String body, HttpParamTypeEnum paramType, CallBack callBack) {
return sendPost(url, headers, body, paramType, null, callBack);
}
/**
* post请求
* @param url 连接地址
* @param headers 请求头
* @param params 参数
* @param paramType 参数类型
* @param callBack 回调方法
* @return T
*/
public static T sendPost(String url, Map headers, Map params, HttpParamTypeEnum paramType, CallBack callBack) {
return sendPost(url, headers, params, paramType, null, callBack);
}
/**
* post请求
* @param url 连接地址
* @param headers 请求头
* @param params 参数
* @param paramType 参数类型
* @param certDto 证书(https需要)
* @param callBack 回调方法
* @return T
*/
public static T sendPost(String url, Map headers, Map params, HttpParamTypeEnum paramType, HttpCertDto certDto, CallBack callBack) {
if (HttpParamTypeEnum.JSON.name().equals(paramType.name())) {
return sendPost(url, headers, JSONObject.toJSONString(params), paramType, certDto, callBack);
} else if (HttpParamTypeEnum.XML.name().equals(paramType.name())) {
throw new ServiceException("please invoke sendPost(String url, String body, HttpParamEnum paramType, CallBack callBack)");
} else if (HttpParamTypeEnum.FORM.name().equals(paramType.name())){
return sendPost(url, headers, toParams(params, null), paramType, certDto, callBack);
}
throw new ServiceException("not support paramType");
}
/**
* 基础get方法
* @param url 连接地址
* @param headers 请求头
* @param params 参数
* @param certDto 证书(https需要)
* @param callBack 回调方法
* @return T
*/
public static T sendGet(String url, Map headers, Map params, HttpCertDto certDto, CallBack callBack) {
HttpGet httpGet = new HttpGet(toParams(params, url));
return invoke(httpGet, headers, certDto, callBack);
}
/**
* 基础post方法
* @param url 连接地址
* @param headers 请求头
* @param body 参数
* @param paramType 参数类型
* @param certDto 证书(https需要)
* @param callBack 回调方法
* @return T
*/
public static T sendPost(String url, Map headers, String body, HttpParamTypeEnum paramType, HttpCertDto certDto, CallBack callBack) {
try {
HttpPost httpPost = new HttpPost(url);
if (!StringUtil.isEmpty(body)) {
if (HttpParamTypeEnum.JSON.name().equals(paramType.name())) {
httpPost.addHeader("Content-type", "application/json; charset=UTF-8");
} else if (HttpParamTypeEnum.XML.name().equals(paramType.name())) {
httpPost.addHeader("Content-type", "application/xml; charset=UTF-8");
}
httpPost.setEntity(new StringEntity(body, StandardCharsets.UTF_8));
}
return invoke(httpPost, headers, certDto, callBack);
} catch (Exception e) {
throw new ServiceException(e);
}
}
/**
* 调用
* @param request 请求体
* @param headers http头
* @param certDto 证书
* @param callBack 调用函数
* @return T
*/
private static T invoke(final HttpRequestBase request, final Map headers, final HttpCertDto certDto, final CallBack callBack) {
CloseableHttpClient client = null;
try {
if (request.getConfig() == null) {
request.setConfig(RequestConfig.custom()
.setSocketTimeout(20000)
.setConnectTimeout(10000)
.build());
}
//加入请求头
if (headers != null && headers.size() > 0) {
headers.forEach(request::addHeader);
}
if (certDto != null) {
client = HttpClients.custom()
.setConnectionManager(getCertConnectionManager(certDto))
.build();
} else {
client = HttpClients.createDefault();
}
CloseableHttpResponse response = client.execute(request);
if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
if (callBack != null) {
return callBack.execute(response.getEntity());
}
}
return null;
} catch (Exception e) {
throw new ServiceException(e);
} finally {
BIOStreamUtil.closeStream(client);
}
}
/**
* get请求参数拼接
* map -> a=1&b=1
* @param params 参数体
* @param url 连接
* @return 拼接后的连接
*/
private static String toParams(Map params, String url) {
if (params == null || params.isEmpty()) {
return url;
}
StringBuilder result = new StringBuilder();
for (String key : params.keySet()) {
if (result.length() > 0) {
result.append("&");
}
String value = String.valueOf(params.get(key));
result.append(StringUtil.encodeUrl(key));
if (value != null && !"".equals(value)) {
result.append("=");
result.append(StringUtil.encodeUrl(value));
}
}
if (url == null) {
return result.toString();
}
if (url.indexOf("?") <= 0) {
return url + "?" + result.toString();
} else {
return url + "&" + result.toString();
}
}
/**
* 获取证书连接管理器
* @param certDto 证书参数
* @return 基础client管理器
*/
private static BasicHttpClientConnectionManager getCertConnectionManager(HttpCertDto certDto) {
try {
// 证书
char[] password = certDto.getPassword().toCharArray();
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(certDto.getCertStream(), password);
// 实例化密钥库 & 初始化密钥工厂
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, password);
// 创建 SSLContext
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
sslContext, new String[]{"TLSv1"},
null, new DefaultHostnameVerifier());
return new BasicHttpClientConnectionManager(
RegistryBuilder.create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", sslConnectionSocketFactory)
.build(), null, null, null);
} catch (Exception e) {
throw new ServiceException(e);
}
}
/**
* 回调函数
*/
@FunctionalInterface
public interface CallBack {
T execute(HttpEntity entity);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy