importjava.io.IOException;importjava.net.SocketTimeoutException;importjava.security.GeneralSecurityException;importjava.security.cert.CertificateException;importjava.security.cert.X509Certificate;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;importjava.util.Map.Entry;importjava.util.Set;importjavax.net.ssl.SSLContext;importjavax.net.ssl.SSLException;importjavax.net.ssl.SSLSession;importjavax.net.ssl.SSLSocket;/*** Created by Administrator on 2018/10/30/030.*/
importorg.apache.commons.io.IOUtils;importorg.apache.commons.lang3.StringUtils;importorg.apache.http.Consts;importorg.apache.http.HttpEntity;importorg.apache.http.HttpResponse;importorg.apache.http.NameValuePair;importorg.apache.http.client.HttpClient;importorg.apache.http.client.config.RequestConfig;importorg.apache.http.client.config.RequestConfig.Builder;importorg.apache.http.client.entity.UrlEncodedFormEntity;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.client.methods.HttpPost;importorg.apache.http.conn.ConnectTimeoutException;importorg.apache.http.conn.ssl.SSLConnectionSocketFactory;importorg.apache.http.conn.ssl.SSLContextBuilder;importorg.apache.http.conn.ssl.TrustStrategy;importorg.apache.http.conn.ssl.X509HostnameVerifier;importorg.apache.http.entity.ContentType;importorg.apache.http.entity.StringEntity;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.impl.conn.PoolingHttpClientConnectionManager;importorg.apache.http.message.BasicNameValuePair;
@SuppressWarnings("all")public classHttpClientUtils {public static final int connTimeout = 10000;public static final int readTimeout = 10000;public static final String charset = "UTF-8";private static HttpClient client = null;static{
PoolingHttpClientConnectionManager cm= newPoolingHttpClientConnectionManager();
cm.setMaxTotal(128);
cm.setDefaultMaxPerRoute(128);
client=HttpClients.custom().setConnectionManager(cm).build();
}public staticString postParameters(String url, String parameterStr)throwsConnectTimeoutException, SocketTimeoutException, Exception {return post(url, parameterStr, "application/x-www-form-urlencoded", charset, connTimeout, readTimeout);
}public staticString postParameters(String url, String parameterStr, String charset, Integer connTimeout,
Integer readTimeout)throwsConnectTimeoutException, SocketTimeoutException, Exception {return post(url, parameterStr, "application/x-www-form-urlencoded", charset, connTimeout, readTimeout);
}public static String postParameters(String url, Mapparams)throwsConnectTimeoutException, SocketTimeoutException, Exception {return postForm(url, params, null, connTimeout, readTimeout);
}public static String postParameters(String url, Mapparams, Integer connTimeout,
Integer readTimeout)throwsConnectTimeoutException, SocketTimeoutException, Exception {return postForm(url, params, null, connTimeout, readTimeout);
}public static String get(String url) throwsException {return get(url, charset, null, null);
}public static String get(String url, String charset) throwsException {returnget(url, charset, connTimeout, readTimeout);
}/*** 发送一个 Post 请求, 使用指定的字符集编码.
*
*@paramurl
*@parambody RequestBody
*@parammimeType 例如 application/xml "application/x-www-form-urlencoded"
* a=1&b=2&c=3
*@paramcharset 编码
*@paramconnTimeout 建立链接超时时间,毫秒.
*@paramreadTimeout 响应超时时间,毫秒.
*@returnResponseBody, 使用指定的字符集编码.
*@throwsConnectTimeoutException 建立链接超时异常
*@throwsSocketTimeoutException 响应超时
*@throwsException*/
public staticString post(String url, String body, String mimeType, String charset, Integer connTimeout,
Integer readTimeout)throwsConnectTimeoutException, SocketTimeoutException, Exception {
HttpClient client= null;
HttpPost post= newHttpPost(url);
String result= "";try{if(StringUtils.isNotBlank(body)) {
HttpEntity entity= newStringEntity(body, ContentType.create(mimeType, charset));
post.setEntity(entity);
}//设置参数
Builder customReqConf =RequestConfig.custom();if (connTimeout != null) {
customReqConf.setConnectTimeout(connTimeout);
}if (readTimeout != null) {
customReqConf.setSocketTimeout(readTimeout);
}
post.setConfig(customReqConf.build());
HttpResponse res;if (url.startsWith("https")) {//执行 Https 请求.
client =createSSLInsecureClient();
res=client.execute(post);
}else{//执行 Http 请求.
client =HttpClientUtils.client;
res=client.execute(post);
}
result=IOUtils.toString(res.getEntity().getContent(), charset);
}finally{
post.releaseConnection();if (url.startsWith("https") && client != null && client instanceofCloseableHttpClient) {
((CloseableHttpClient) client).close();
}
}returnresult;
}/*** 提交form表单
*
*@paramurl
*@paramparams
*@paramconnTimeout
*@paramreadTimeout
*@return*@throwsConnectTimeoutException
*@throwsSocketTimeoutException
*@throwsException*/
public static String postForm(String url, Map params, Mapheaders,
Integer connTimeout, Integer readTimeout)throwsConnectTimeoutException, SocketTimeoutException, Exception {
HttpClient client= null;
HttpPost post= newHttpPost(url);try{if (params != null && !params.isEmpty()) {
List formParams = new ArrayList();
Set> entrySet =params.entrySet();for (Entryentry : entrySet) {
formParams.add(newBasicNameValuePair(entry.getKey(), entry.getValue()));
}
UrlEncodedFormEntity entity= newUrlEncodedFormEntity(formParams, Consts.UTF_8);
post.setEntity(entity);
}if (headers != null && !headers.isEmpty()) {for (Entryentry : headers.entrySet()) {
post.addHeader(entry.getKey(), entry.getValue());
}
}//设置参数
Builder customReqConf =RequestConfig.custom();if (connTimeout != null) {
customReqConf.setConnectTimeout(connTimeout);
}if (readTimeout != null) {
customReqConf.setSocketTimeout(readTimeout);
}
post.setConfig(customReqConf.build());
HttpResponse res= null;if (url.startsWith("https")) {//执行 Https 请求.
client =createSSLInsecureClient();
res=client.execute(post);
}else{//执行 Http 请求.
client =HttpClientUtils.client;
res=client.execute(post);
}return IOUtils.toString(res.getEntity().getContent(), "UTF-8");
}finally{
post.releaseConnection();if (url.startsWith("https") && client != null && client instanceofCloseableHttpClient) {
((CloseableHttpClient) client).close();
}
}
}/*** 发送一个 GET 请求
*
*@paramurl
*@paramcharset
*@paramconnTimeout 建立链接超时时间,毫秒.
*@paramreadTimeout 响应超时时间,毫秒.
*@return*@throwsConnectTimeoutException 建立链接超时
*@throwsSocketTimeoutException 响应超时
*@throwsException*/
public staticString get(String url, String charset, Integer connTimeout, Integer readTimeout)throwsConnectTimeoutException, SocketTimeoutException, Exception {
HttpClient client= null;
HttpGet get= newHttpGet(url);
String result= "";try{//设置参数
Builder customReqConf =RequestConfig.custom();if (connTimeout != null) {
customReqConf.setConnectTimeout(connTimeout);
}if (readTimeout != null) {
customReqConf.setSocketTimeout(readTimeout);
}
get.setConfig(customReqConf.build());
HttpResponse res= null;if (url.startsWith("https")) {//执行 Https 请求.
client =createSSLInsecureClient();
res=client.execute(get);
}else{//执行 Http 请求.
client =HttpClientUtils.client;
res=client.execute(get);
}
result=IOUtils.toString(res.getEntity().getContent(), charset);
}finally{
get.releaseConnection();if (url.startsWith("https") && client != null && client instanceofCloseableHttpClient) {
((CloseableHttpClient) client).close();
}
}returnresult;
}/*** 从 response 里获取 charset
*
*@paramressponse
*@return
*/@SuppressWarnings("unused")private staticString getCharsetFromResponse(HttpResponse ressponse) {//Content-Type:text/html; charset=GBK
if (ressponse.getEntity() != null && ressponse.getEntity().getContentType() != null
&& ressponse.getEntity().getContentType().getValue() != null) {
String contentType=ressponse.getEntity().getContentType().getValue();if (contentType.contains("charset=")) {return contentType.substring(contentType.indexOf("charset=") + 8);
}
}return null;
}/*** 创建 SSL连接
*
*@return*@throwsGeneralSecurityException*/
private static CloseableHttpClient createSSLInsecureClient() throwsGeneralSecurityException {try{
SSLContext sslContext= new SSLContextBuilder().loadTrustMaterial(null, newTrustStrategy() {public boolean isTrusted(X509Certificate[] chain, String authType) throwsCertificateException {return true;
}
}).build();
SSLConnectionSocketFactory sslsf= new SSLConnectionSocketFactory(sslContext, newX509HostnameVerifier() {
@Overridepublic booleanverify(String arg0, SSLSession arg1) {return true;
}
@Overridepublic void verify(String host, SSLSocket ssl) throwsIOException {
}
@Overridepublic void verify(String host, X509Certificate cert) throwsSSLException {
}
@Overridepublic void verify(String host, String[] cns, String[] subjectAlts) throwsSSLException {
}
});returnHttpClients.custom().setSSLSocketFactory(sslsf).build();
}catch(GeneralSecurityException e) {throwe;
}
}public static voidmain(String[] args) {try{
String str= post("https://localhost:443/ssl/test.shtml", "name=12&page=34","application/x-www-form-urlencoded", "UTF-8", 10000, 10000);//String str=//get("https://localhost:443/ssl/test.shtml?name=12&page=34","GBK");
/** Map map = new HashMap(); map.put("name",
* "111"); map.put("page", "222"); String str=
* postForm("https://localhost:443/ssl/test.shtml",map,null, 10000, 10000);*/System.out.println(str);
}catch(ConnectTimeoutException e) {
e.printStackTrace();
}catch(SocketTimeoutException e) {
e.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}
}
}