All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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