java封装httpClient工具(支持http和https,包含get和post请求)
来源:互联网 发布:南风知我意林如斯txt 编辑:程序博客网 时间:2024/05/21 09:19
网上有关方法非常多,但相对较零散,有些只支持http或https中的一种,或者只有get或post中的一种。以下对httpclient工具做了比较全面的封装,支持http和https,包含get和post请求。
maven导入的jar包有:
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.5</version></dependency><!--阿里 FastJson依赖 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.37</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpasyncclient</artifactId></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId></dependency>
代码:
import java.io.IOException;import java.io.InputStream;import java.nio.charset.Charset;import java.security.GeneralSecurityException;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;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSession;import org.apache.commons.io.IOUtils;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.config.RequestConfig;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.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.conn.ssl.TrustStrategy;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.PoolingHttpClientConnectionManager;import org.apache.http.message.BasicNameValuePair;import org.apache.http.ssl.SSLContextBuilder;import org.apache.http.util.EntityUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject; import com.core.ServiceException; //自定义的一个异常类。public class HttpsUtils {private static PoolingHttpClientConnectionManagerconnMgr;private static RequestConfigrequestConfig;private static final intMAX_TIMEOUT= 7000;private static final Loggerlogger= LoggerFactory.getLogger(HttpsUtils.class);static {// 设置连接池connMgr = new PoolingHttpClientConnectionManager();// 设置连接池大小connMgr.setMaxTotal(100);connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());// Validate connections after 1 sec of inactivityconnMgr.setValidateAfterInactivity(1000);RequestConfig.Builder configBuilder = RequestConfig.custom();// 设置连接超时configBuilder.setConnectTimeout(MAX_TIMEOUT);// 设置读取超时configBuilder.setSocketTimeout(MAX_TIMEOUT);// 设置从连接池获取连接实例的超时configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);requestConfig = configBuilder.build();}/** * 发送 GET 请求(HTTP),不带输入数据 * * @param url * @return */public static JSONObject doGet(String url) {return doGet(url, new HashMap<String, Object>());}/** * 发送 GET 请求(HTTP),K-V形式 * * @param url * @param params * @return */public static JSONObject doGet(String url, Map<String, Object> params) {String apiUrl = url;StringBuffer param = new StringBuffer();int i = 0;for (String key : params.keySet()) {if (i == 0)param.append("?");elseparam.append("&");param.append(key).append("=").append(params.get(key));i++;}apiUrl += param;String result = null;HttpClient httpClient = null;if (apiUrl.startsWith("https")) {httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();} else {httpClient = HttpClients.createDefault();}try {HttpGet httpGet = new HttpGet(apiUrl);HttpResponse response = httpClient.execute(httpGet);HttpEntity entity = response.getEntity();if (entity != null) {InputStream instream = entity.getContent();result = IOUtils.toString(instream, "UTF-8");}} catch (IOException e) {LoggerUtils.error(logger, e, e.getMessage());throw new ServiceException(e.getMessage());}return JSON.parseObject(result);}/** * 发送 POST 请求(HTTP),不带输入数据 * * @param apiUrl * @return */public static JSONObject doPost(String apiUrl) {return doPost(apiUrl, new HashMap<String, Object>());}/** * 发送 POST 请求,K-V形式 * * @param apiUrl * API接口URL * @param params * 参数map * @return */public static JSONObject doPost(String apiUrl, Map<String, Object> params) {CloseableHttpClient httpClient = null;if (apiUrl.startsWith("https")) {httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();} else {httpClient = HttpClients.createDefault();}String httpStr = null;HttpPost httpPost = new HttpPost(apiUrl);CloseableHttpResponse response = null;try {httpPost.setConfig(requestConfig);List<NameValuePair> pairList = new ArrayList<>(params.size());for (Map.Entry<String, Object> entry : params.entrySet()) {NameValuePair pair = new BasicNameValuePair(entry.getKey(), entry.getValue().toString());pairList.add(pair);}httpPost.setEntity(new UrlEncodedFormEntity(pairList, Charset.forName("UTF-8")));response = httpClient.execute(httpPost);HttpEntity entity = response.getEntity();httpStr = EntityUtils.toString(entity, "UTF-8");} catch (IOException e) {LoggerUtils.error(logger, e, e.getMessage());throw new ServiceException(e.getMessage());} finally {if (response != null) {try {EntityUtils.consume(response.getEntity());} catch (IOException e) {LoggerUtils.error(logger, e, e.getMessage());throw new ServiceException(e.getMessage());}}}return JSON.parseObject(httpStr);}/** * 发送 POST 请求,JSON形式 * * @param apiUrl * @param json * json对象 * @return */public static JSONObject doPost(String apiUrl, Object json) {CloseableHttpClient httpClient = null;if (apiUrl.startsWith("https")) {httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig).build();} else {httpClient = HttpClients.createDefault();}String httpStr = null;HttpPost httpPost = new HttpPost(apiUrl);CloseableHttpResponse response = null;try {httpPost.setConfig(requestConfig);StringEntity stringEntity = new StringEntity(json.toString(), "UTF-8");// 解决中文乱码问题stringEntity.setContentEncoding("UTF-8");stringEntity.setContentType("application/json");httpPost.setEntity(stringEntity);response = httpClient.execute(httpPost);HttpEntity entity = response.getEntity();httpStr = EntityUtils.toString(entity, "UTF-8");} catch (IOException e) {LoggerUtils.error(logger, e, e.getMessage());throw new ServiceException(e.getMessage());} finally {if (response != null) {try {EntityUtils.consume(response.getEntity());} catch (IOException e) {LoggerUtils.error(logger, e, e.getMessage());throw new ServiceException(e.getMessage());}}}return JSON.parseObject(httpStr);}/** * 创建SSL安全连接 * * @return */private static SSLConnectionSocketFactory createSSLConnSocketFactory() {SSLConnectionSocketFactory sslsf = null;try {SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {return true;}}).build();sslsf = new SSLConnectionSocketFactory(sslContext, new HostnameVerifier() {@Overridepublic boolean verify(String arg0, SSLSession arg1) {return true;}});} catch (GeneralSecurityException e) {LoggerUtils.error(logger, e, e.getMessage());throw new ServiceException(e.getMessage());}return sslsf;}}
阅读全文